在 Swift 中使用参数将图像发送到服务器

Posted

技术标签:

【中文标题】在 Swift 中使用参数将图像发送到服务器【英文标题】:Sending Image to server with parameters in Swift 【发布时间】:2015-12-30 11:15:22 【问题描述】:

我正在尝试使用 Alamofire 在服务器上发送带有 json 参数的图像。但在服务器上,他们能够接收图像,但不能接收我发送的Json。以下是我正在使用的代码:

let parameters: [String : String] = [
            "preferredVenueType": "club",
            "userId": "1"
        ]
let urlRequest = urlRequestWithComponents(baseURL + uploadImage, parameters: parameters , imageData: imageData!)
upload(urlRequest.0, data: urlRequest.1)
 .progress  (bytesWritten, totalBytesWritten,   totalBytesExpectedToWrite) in
 //print("\(totalBytesWritten) / \(totalBytesExpectedToWrite)")
 
.responseJSON response in
                    if let JSON = response.result.value 
                        print("JSON: \(JSON)")
 




func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData) -> (URLRequestConvertible, NSData) 

        // create url request to send
        let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
        mutableURLRequest.HTTPMethod = Method.POST.rawValue
        let boundaryConstant = "myRandomBoundary12345";
        let contentType = "multipart/form-data;boundary="+boundaryConstant
        mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")

       // mutableURLRequest.HTTPBody = jsonData


        // create upload data to send
        let uploadData = NSMutableData()

        // add image
        uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Disposition: form-data; name=\"profileImage\"; filename=\"profileImage.png\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData(imageData)

        // add parameters
        for (key, value) in parameters 
            uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
            uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
          //  uploadData.appendData("Content-Disposition: form-data; name=\"json\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)

                        
        uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)



        // return URLRequestConvertible and NSData
        return (ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)

    

我收到错误消息作为响应,因为他们无法接收JSON 数据以及图像文件。

【问题讨论】:

你检查过alamo fire multipart upload吗? @the_UB 我也检查了这个但仍然无法正常工作...... 【参考方案1】:

我通过将参数作为JSON String 而不是键值对发送来解决了我的问题。

 let parameters: [String : String] = [
            "preferredVenueType": prameterText,
            "userId": userId,
        ]
         var theJSONText : NSString  = ""

        do 
            let theJSONData = try NSJSONSerialization.dataWithJSONObject(
                parameters ,
                options: NSJSONWritingOptions(rawValue: 0))
            theJSONText = NSString(data: theJSONData,
                encoding: NSASCIIStringEncoding)!
            // due to some reason NSUTF8StringEncoding was not working so i used ASCII encoding
         catch let error as NSError 
            print(error)
        

在将其发送到我使用的服务器时

let uploadData = NSMutableData()

        uploadData.appendData("--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Disposition: form-data; name=\"json\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("\(theJSONText)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)

将参数作为JSON String发送后,数据成功上传到服务器。

【讨论】:

我遇到了同样的问题,无法上传图片。我想尝试您的演示,但使用未声明的类型“URLRequestConvertible”。如果可能的话,一个请求你能给出完整的代码吗?在驱动器或电子邮件或您喜欢的其他方式上。 @jay:您好,请给我您的电子邮件 ID,我将向您发送与图片上传相关的完整代码。【参考方案2】:

您好,我不了解 swift。但是根据您的问题,服务器接收图像意味着 url 是正确的。所以

1) 首先检查您发送的数据。可能是您发送的数据类型错误。 eg:服务器端dictionary[dictionary],你的发送dictionary就是这样。

2) 检查标题字段。

3)检查标题字段对象和键的名称。(大写或小写)每个字母。

4) 最后在您的项目 .plist 文件中添加以下代码。添加到项目中的每个 plist。

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
 </dict>

要添加它,请右键单击 .plist ,然后将其作为源代码打开。复制上面的行并将"&lt;/dict&gt;&lt;/plist&gt;" 之前的行放在最后。

试试这个..我不确定这个,它会有用。

【讨论】:

以上是关于在 Swift 中使用参数将图像发送到服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中使用 Alamofire 上传带有 JSON 参数的图像?

在 SWIFT 中上传带有其他参数的图像

将图像从 ios swift 3 上传到 jsp Web 服务

Swift 3 使用 CKAsset 将图像发送到 CloudKit

为啥我无法正确获取图像数据或无法将数据发送到服务器?

使用 PHP 在 Swift 5 中使用 Alamofire 接收图像上传