iOS - 管道文件到HTTP请求

时间:2017-03-24 21:19:10

标签: ios networking amazon-s3 pre-signed-url

我尝试使用预先签名的请求将大型文件(例如不适合内存)文件上传到S3。我终于让它与curl一起工作

curl -v -T video.mp4 "http://<myBucket>.s3.amazonaws.com/video.mp4?AWSAccessKeyId=<myAccessKey>&Expires=1492187347&Signature=vpcUnvGALlVXju31Qk2nXNmBTgc%3D"

我现在尝试从我的应用中执行此操作。我首先尝试使用AF(我不想使用):

let videoPath = Bundle.main.path(forResource: "media", ofType: "mov")!
let videoUrl = URL(fileURLWithPath: videoPath)
let presignedUrl = "http://<myBucket>.s3.amazonaws.com/video.mp4?AWSAccessKeyId=<myAccessKey>&Expires=1492187347&Signature=vpcUnvGALlVXju31Qk2nXNmBTgc%3D"
request = Alamofire.upload(videoUrl, to: presignedUrl, method: .put, headers: [:])
request.responseString(completionHandler: { response in
    print(response)
})
request.resume()

打印成功的响应实际上是一个错误:

The request signature we calculated does not match the signature you provided. Check your key and signing method.

我已经在一些地方读到标题可能存在问题,而且我还是不想在这里使用AF。

Swift中的内容相当于curl -T filePath url

1 个答案:

答案 0 :(得分:0)

签署请求时,传递内容类型。在节点中:

long double

现在在swift:

var AWS = require('aws-sdk');

AWS.config.update({
  accessKeyId: accessKeyId,
  secretAccessKey: secretAccessKey,
  region: 'us-east-1',
});

var s3 = new AWS.S3();

var params = {
  Bucket: bucketName,
  Key: 'path/my-video.mp4',  
  Expires: 1800000,
  ContentType: 'video/mp4',
};
var signedUrl = s3.getSignedUrl('putObject', params)
// returns something like:
// https://<- my bucket ->.s3.amazonaws.com/path/my-video.mp4?AWSAccessKeyId=<- my access key ->&Content-Type=video%2Fmp4&Expires=1492203291&Signature=HeRBUObYQiQ6FIH%2Fg%2FOI0qv57VY%3D