2017-01-06 9 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

Вы можете сделать структуру, которая принимает весь Func Params, а затем создать функцию, которая принимает массив этих структур, то в функции вы можете перебрать массив, а затем вернуть массив запросов. Если вы хотите, чтобы все это было сделано сразу, потому что вам нужно что-то сделать, когда все закачки завершены, просмотрите очередь операций или группу отправки. – JustinM

+0

. См. Ссылку http://stackoverflow.com/questions/28448837/uploading-multiple- image-files-with-swift, http://stackoverflow.com/questions/40527140/mysql-and-swift-upload-image-and-file-would-it-be-better-to-use-alamofire –

ответ

13

Swift 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?

Я наклеить их решение для удобства, но они сказали, что это работает для Swift 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)") 
      } 
    }) 

появляется решение должно основываться выключение рекомендуемое подход подробно в документации Alamofire здесь: 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

Это один помогает мне:

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) 
}