Swift2 在iOS 9问题上使用Alamofire上传带有URL参数的图像

Swift2 在iOS 9问题上使用Alamofire上传带有URL参数的图像,swift2,ios9,alamofire,Swift2,Ios9,Alamofire,我有一个用Swift 2.0编写的iOS应用程序,它将图像上传到Microsoft Azure Blob存储。我使用Alamofire处理请求 在配备iOS 8的设备上,一切正常,但在iOS 9上,上传时会出错: let AlamofireManager = Alamofire.Manager.sharedInstance AlamofireManager.session.configuration.HTTPAdditionalHeaders = [ "Conte

我有一个用Swift 2.0编写的iOS应用程序,它将图像上传到Microsoft Azure Blob存储。我使用Alamofire处理请求

在配备iOS 8的设备上,一切正常,但在iOS 9上,上传时会出错:

    let AlamofireManager = Alamofire.Manager.sharedInstance
    AlamofireManager.session.configuration.HTTPAdditionalHeaders = [
        "Content-Type": "image/jpg",
        "x-ms-blob-type": "BlockBlob"
    ]
    AlamofireManager.upload(.PUT, uploadURL, data: imageData)
        .responseJSON { (request, response, result) in
            print("Request=\(request)")
            print("response=\(response)")
            print("result=\(result)")
            if (response) != nil {
                let statusString = String(stringInterpolationSegment: response!.statusCode)
                let statusCode = self.getStatusCodeFromStatusString(statusString)
                if (statusCode == 201) {
                    // MY SUCCESS CODE IS HERE
                }
                else {
                    // STATUSCODE != 201
                }
            }
            else {
                // OTHER ERROR
            }
       }
上载的示例URL(
uploadURL
)可能是:

https://mystorage.blob.core.windows.net:443/thumbs/7346e38a-eb54-48ea-b0fe-89357100dd18.jpg?sv=2013-08-15&sr=b&sig=GYwHvnUc52GsajFJCAu1v4W5qG0wSBpaXvxncD%2FAt34%3D&st=2015-10-01T11%3A25%3A57Z&se=2015-10-01T11%3A4 0%3A57Z&sp=w

对于Azure来说,重要的是: a) HTTP动词是
PUT
b) Url参数包含在Url中,而不是作为多部分数据(这是上载的访问令牌)

也许Alamofire在创建带有参数的URL时会遇到问题

此解决方案不起作用,因为它基于多部分数据上传:

考虑到URL参数问题,我尝试了以下方法:

    let AlamofireManager = Alamofire.Manager.sharedInstance
    AlamofireManager.session.configuration.HTTPAdditionalHeaders = [
        "Content-Type": "image/jpg",
        "x-ms-blob-type": "BlockBlob"
    ]
    var URLRequest: NSMutableURLRequest {
        let URL = NSURL(string: uploadURL)!
        var mutableRequest = NSMutableURLRequest(URL: URL)
        mutableRequest.HTTPMethod = Alamofire.Method.PUT.rawValue
        return mutableRequest
    }
    AlamofireManager.upload(URLRequest, data: imageData)
:
: rest is same like above
:
但这也不行。在这两种情况下,我总是从服务器收到一个400错误(在
响应中。statusCode
)<代码>结果
包含
故障
和信息
NSCocoaErrorDomain-代码3840
,说明
字符3周围的值无效

但在iOS 8上,该解决方案就像一个魅力:(

有什么想法吗?问题是什么?如何解决


编辑:或者端口可能是问题所在?

是我自己弄到的。Alamofire似乎没有像Alamofire Manager预期的那样发送HTTP头。我手动添加了头:

    var URLRequest: NSMutableURLRequest {
        let URL = NSURL(string: uploadURL)!
        var mutableRequest = NSMutableURLRequest(URL: URL)
        mutableRequest.HTTPMethod = Alamofire.Method.PUT.rawValue
        mutableRequest.setValue("image/jpg", forHTTPHeaderField: "Content-Type")
        mutableRequest.setValue("BlockBlob", forHTTPHeaderField: "x-ms-blob-type")
        return mutableRequest
    }

    AlamofireManager.upload(URLRequest, data: imageData)
    :
    :

我自己弄到的。Alamofire似乎没有像AlamofireManager预期的那样发送HTTP头。我手动添加了头:

    var URLRequest: NSMutableURLRequest {
        let URL = NSURL(string: uploadURL)!
        var mutableRequest = NSMutableURLRequest(URL: URL)
        mutableRequest.HTTPMethod = Alamofire.Method.PUT.rawValue
        mutableRequest.setValue("image/jpg", forHTTPHeaderField: "Content-Type")
        mutableRequest.setValue("BlockBlob", forHTTPHeaderField: "x-ms-blob-type")
        return mutableRequest
    }

    AlamofireManager.upload(URLRequest, data: imageData)
    :
    :

Alamofire完全按照预期发送头。您需要创建自己的会话配置并在创建URL会话之前添加头,否则iOS 9将不会附加头。Alamofire完全按照预期发送头。您需要创建自己的会话配置并在创建URL会话之前添加头,其他wise iOS 9不会附加头。