繁体   English   中英

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

[英]Sending Image to server with parameters in Swift

我正在尝试使用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数据,因此我收到错误消息作为响应。

我通过将参数作为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发送后,数据已成功上传到服务器。

嗨,我对快速不了解。 但是根据您的问题,服务器接收的图像表示url是正确的。 所以

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

2)检查标题字段。

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

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

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

要添加此内容,请右键单击.plist,然后将其作为源代码打开。复制上面的行,并在最后的"</dict></plist>"之前的行之后。

只需尝试一下即可。我对此不太确定,它将很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM