2017-01-06 32 views
10

我用下面的代碼到一個單一的圖像上傳到服務器:上傳在迅速多幅圖像使用Alamofire

private static func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData?, imageName: String) -> (URLRequestConvertible , NSData) { 

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


    // create upload data to send 
    let uploadData = NSMutableData() 
    if(imageData != nil && imageData?.length != 0) { 
     // add image 
     uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     uploadData.appendData("Content-Disposition: form-data; name=\"\(imageName)\"; filename=\"\(StringHelper.sharedInstance.randomString(5)).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("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
    print("upload",parameters) 
    // return URLRequestConvertible and NSData 
    return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData) 
} 

我如何可以通過修改這些代碼上傳單個參數多張圖片?

+0

如何上傳多張圖片陣列在一個單一的pararmeter –

+1

你可以讓一個struct是把你的所有FUNC參數,可以再創建一個函數,這些結構的數組,然後在功能,您可以遍歷該數組,然後返回一個請求數組。如果您希望全部一次完成,因爲在完成所有上傳時需要執行某些操作,請查看操作隊列或調度組 – JustinM

+0

請參閱鏈接http://stackoverflow.com/questions/28448837/uploading-multiple-圖像文件與迅速,http://stackoverflow.com/questions/40527140/mysql-and-swift-upload-image-and-file-would-it-be-better-to-use-alamofire –

回答

13

夫特3 只要使用 「[]」 與圖像上載PARAM以使其圖像的陣列。

Alamofire.upload(multipartFormData: { multipartFormData in 
      // import image to request 
      for imageData in imagesData { 
       multipartFormData.append(imageData, withName: "\(imageParamName)[]", fileName: "\(Date().timeIntervalSince1970).jpeg", mimeType: "image/jpeg") 
      } 
      for (key, value) in parameters { 
       multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key) 
      } 
     }, to: urlString, 

      encodingCompletion: { encodingResult in 
       switch encodingResult { 
       case .success(let upload, _, _): 
        upload.responseJSON { response in 

        } 
       case .failure(let error): 
        print(error) 
       } 

     }) 
+0

短和簡單的方法來上傳多個圖像,謝謝 –

+0

你能解釋一下上面的代碼片段嗎? – Saurabh

+0

上面的代碼是上傳多個圖片集合,根據代碼你有圖片Data(Foundation.Data)在'imagesData'數組中。問題在於當使用迭代創建mutipartFormData時,它覆蓋了以前的圖像數據值。但通過在參數名稱的末尾附加'[]'方括號可以將數據加載到數組中。而已。同樣的事情,你可以看到郵遞員應用程序上傳圖像數組。謝謝。如果沒有問題,請註冊。 –

1

看起來這個問題已經在SO上得到解答,可能在多個地方。這裏是一個鏈接,我發現:

How to upload multiple images in multipart using Alamofire?

我會貼上他們的解決方案爲方便起見,但他們說,它適用於斯威夫特3.X:

//MARK: - upload multiple photos 

func uploadImagesAndData(params:[String : AnyObject]?,image1: UIImage,image2: UIImage,image3: UIImage,image4: UIImage,headers : [String : String]?, completionHandler:@escaping CompletionHandler) -> Void { 

    let imageData1 = UIImageJPEGRepresentation(image1, 0.5)! 
    let imageData2 = UIImageJPEGRepresentation(image2, 0.5)! 

    let imageData3 = UIImageJPEGRepresentation(image3, 0.5)! 

    let imageData4 = UIImageJPEGRepresentation(image4, 0.5)! 


    Alamofire.upload(multipartFormData: { multipartFormData in 

      for (key, value) in params! { 
       if let data = value.data(using: String.Encoding.utf8.rawValue) { 
        multipartFormData.append(data, withName: key) 
       } 
      } 

      multipartFormData.append(imageData1, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg") 
      multipartFormData.append(imageData2, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg") 
      multipartFormData.append(imageData3, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg") 
      multipartFormData.append(imageData4, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg") 

    }, 
     to: K_BASEURL + K_API_LOGINDATA, encodingCompletion: { encodingResult in 
      switch encodingResult { 
      case .success(let upload, _, _): 
       upload 
        .validate() 
        .responseJSON { response in 
         switch response.result { 
         case .success(let value): 
          print("responseObject: \(value)") 
         case .failure(let responseError): 
          print("responseError: \(responseError)") 
         } 
       } 
      case .failure(let encodingError): 
       print("encodingError: \(encodingError)") 
      } 
    }) 

出現該解決方案是基於關閉https://github.com/Alamofire/Alamofire#uploading-multipartformdata

Alamofire.upload(
multipartFormData: { multipartFormData in 
    multipartFormData.append(unicornImageURL, withName: "unicorn") 
    multipartFormData.append(rainbowImageURL, withName: "rainbow") 
}, 
to: "https://httpbin.org/post", 
encodingCompletion: { encodingResult in 
    switch encodingResult { 
    case .success(let upload, _, _): 
     upload.responseJSON { response in 
      debugPrint(response) 
     } 
    case .failure(let encodingError): 
     print(encodingError) 
    } 
}) 
3

這一個幫助我:Alamofire文件在這裏詳細介紹推薦的方法:

private func urlRequestWithComponentsForUploadMultipleImages(urlString:String, parameters:Dictionary<String, String>, imagesData:[Data], imageName: String) -> (URLRequestConvertible , Data) { 

    // create url request to send 
    var mutableURLRequest = URLRequest(url: NSURL(string: urlString)! as URL) 

    mutableURLRequest.httpMethod = Alamofire.HTTPMethod.post.rawValue 
    let boundaryConstant = "myRandomBoundary12345"; 
    let contentType = "multipart/form-data;boundary="+boundaryConstant 
    mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type") 


    // create upload data to send 
    var uploadData = Data() 
    // add image 
    for data in imagesData { 
     uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!) 
     uploadData.append("Content-Disposition: form-data; name=\"\(imageName)\"; filename=\"\(Date().timeIntervalSince1970).jpeg\"\r\n".data(using: String.Encoding.utf8)!) 
     uploadData.append("Content-Type: image/jpeg\r\n\r\n".data(using: String.Encoding.utf8)!) 
     uploadData.append(data) 
    } 
    // add parameters 
    for (key, value) in parameters { 
     uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!) 
     uploadData.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".data(using: String.Encoding.utf8)!) 
    } 
    uploadData.append("\r\n--\(boundaryConstant)--\r\n".data(using: String.Encoding.utf8)!) 
    print("upload",parameters) 
    return (mutableURLRequest , uploadData) 
}