当前位置: 首页 > 知识库问答 >
问题:

将文件上载到S3服务403错误(com.amazonaws.AWSS3TransferUtilityErrorDomain错误2。)Swift iOS

松增
2023-03-14

我试图将我的文件上传到S3服务vie AWSS3 SDK swft。我的代码:

    let credentialsProvider = AWSStaticCredentialsProvider(accessKey: Config.main.accessKey, secretKey: Config.main.secretKey)
    let configuration = AWSServiceConfiguration(region: .USEast1, endpoint: AWSEndpoint(url: URL(string: Config.main.AWS_ENDPOINT)!), credentialsProvider: credentialsProvider)
    AWSServiceManager.default().defaultServiceConfiguration = configuration

let image = UIImage(named: "photo")!
let data: Data = image.pngData()!
let remoteName = generateRandomStringWithLength(length: 12) + "." + data.format
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsURL.appendingPathComponent(remoteName)
try! data.write(to: fileURL, options: .atomic)
upload(fileUrl: fileURL, fileData: data, fileName: remoteName, type: .image, completionHandler: {_ in})
func upload(fileUrl: URL, fileData: Data, fileName: String, type: FileTypes, completionHandler: @escaping (URL?) -> ()) {

    let expression = AWSS3TransferUtilityUploadExpression()
    expression.progressBlock = { task, progress in
        DispatchQueue.main.async {
            print("Progress = \(progress.completedUnitCount)/\(progress.totalUnitCount)")
        }
    }
    let util = AWSS3TransferUtility.default()
    util.uploadData(
        fileData,
        bucket: self.getBucket(type: type),
        key: "\(self.getDir(type: type))_\(fileName)",
        contentType: "image/png",
        expression: expression) { task, error in
            print("ERROR: \(error?.localizedDescription)")
            print("response: \(task.response)")
            print("response: \(task.response)")

        }.continueWith { task in
            if let error = task.error {
                print("ERROR1: \(error.localizedDescription)")
            }
            return nil
    }
}

它会给我5倍的进度响应,然后

错误:可选(“操作无法完成。(com.amazonaws.AWSS3TransferUtilityErrorDomain错误2.))

响应:可选({URL:http://(bucket)。(主机)/image_L24i8RGCeAaj.png?X-Amz-Algorithm=AWS4-HMAC-SHA256

同样设置的Android应用程序工作得非常完美。

这个问题的解决办法是什么?

共有3个答案

曹华荣
2023-03-14

这里有一些有用的信息https://medium.com/@刘易斯/签名-aws4-31DCFF1BF1F,杰夫·刘易斯。

它使用CryptoSwift库;我现在正在将其转换为使用新的CryptoKit

栾弘新
2023-03-14

hi如果不使用自定义endpoint,请更改此行:

let configuration=AWSServiceConfiguration(区域:.USEast1,endpoint:AWSEndpoint(url:url(字符串:Config.main.AWS_endpoint)!),credentialsProvider:credentialsProvider)

致:

让配置=AWSServiceConfiguration(区域:.USEast1,凭据提供商:凭据提供商)

它会很好的工作。SDK可以自行解析服务的endpoint,而无需提供endpoint。只有在使用自定义endpoint时,才需要提供endpoint。这里还值得注意的是,如果您确实想通过endpoint,则需要确保您通过了正确的endpoint,并且us-east-1 for s3有一个特殊的endpoint,该endpoint不包括区域,如下所示:

让配置=AWSServiceConfiguration(区域:.USEast1, endpoint: AWSEndpoint(url: URL(string:"https://s3.amazonaws.com ")) , 凭据提供商:凭据提供商)

越霖
2023-03-14

我也有同样的问题。android上的一切都很好,而IOS的配置却不一样。

然后我联系了AWS支持,他们告诉我iPhone的日期和时间是错误的。我只是调整了日期和时间以更正日期和时间,然后尝试上传,结果成功了。

 类似资料:
  • 尝试将文件上载到S3 Bucket,我使用以下代码设置SDK: 错误日志 可能的错误: URL应基于以下表单:文档

  • 我在Localhost中正确上传我的文件,但是当我在服务器上上传我的应用程序时,他们给我错误:上传文件后服务器错误。 这是我的控制器: 在我的本地主机中,文件保存在公用文件夹中。我想用public\u html或public\u html/image将我的文件保存在我的服务中。

  • 有人能帮我弄清楚发生了什么吗? 我正在尝试加载测试一个用户可以上传和下载文件的应用程序。 旅程: 步骤1:当用户从磁盘选择文件(POST请求)时,它会创建一个文件ID和带有uuid的路径。 响应如下: 第2步:使用这些(POST请求),它用s3 uri响应,并带有评估码ID、秘书访问码和会话令牌。 响应如下:

  • 我正在使用pyspark,在向S3写入数据时遇到了问题,但从S3读取数据并不是问题。 这是我的代码: 这是错误: 有什么问题?

  • 开始时,我可以通过以下curl请求上传我的文件: curl-u“admin:admin”-X POSThttp://myurlu:9086/service/rest/v1/components?repository=ebooks-store“-H”accept:application/json“-H”内容类型:multipart/form data“-F”raw。目录=测试“-F”原始。asset

  • 我测试了.NET web API,postman正在工作,但我尝试在Android中使用okhttp3和retrofit2。我都收到了内部服务器错误500。怎么了?我该怎么办? 分级 实现“com.squareup.okhttp3:okhttp:3.4.1” 实现“com.squareup.okhttp3:logging-interceptor:3.4.1” 实现“com.squareup.rev