2017-01-06 5 views
10

ich den folgenden Code bin mit einem einzigen Bild zu einem Server laden:Hochladen mehrerer Bilder in rascher mit 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) 
} 

Wie kann ich bearbeite diesen Code mehrere Bilder in einzelnen Parameter hochladen?

+0

wie können mehrere Bilder Array in einem einzigen pararmeter hochladen –

+1

Sie können eine Struktur bilden, die alle Ihre func params nimmt, dann eine Funktion erstellen, die ein Array dieser Strukturen nimmt, dann in der Funktion können Sie iterieren das Array und dann ein Array von Anforderungen zurückgeben. Wenn Sie alles auf einmal erledigen möchten, weil Sie nach Abschluss aller Uploads etwas tun müssen, schauen Sie in die Operation-Warteschlange oder in die Dispatch-Gruppe – JustinM

+0

. Weitere Informationen finden Sie unter 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 –

Antwort

13

Swift 3 Verwenden Sie einfach "[]" mit Bild-Upload param es Anordnung von Bildern zu machen.

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

Kurz und einfache Möglichkeit, mehrere Bilder hochzuladen, Danke –

+0

Können Sie bitte das obige Code-Snippet erklären? – Saurabh

+0

Der obige Code ist zum Hochladen mehrerer Bilder Sammlung, je nach dem Code haben Sie Bilder Daten (Foundation.Data) in 'imagesData' Array. Das Problem war, dass der vorherige Bilddatenwert beim Erstellen von multipartsFormData mit Iteration überschrieben wird. Durch Anhängen von '[]' eckigen Klammern an das Ende des Paramnamens können Daten in das Array geladen werden. Das ist es. Das Gleiche können Sie in der Postbote-Anwendung sehen, um ein Array von Bildern hochzuladen. Vielen Dank. Bitte upvote wenn es in Ordnung ist. –

1

Es sieht so aus, als ob diese Frage bereits auf SO beantwortet wurde, wahrscheinlich an mehreren Stellen. Hier ist ein Link, den ich gefunden:

How to upload multiple images in multipart using Alamofire?

ich ihre Lösung für die Bequemlichkeit einfügen werde aber sie sagte, dass es für Swift 3.x funktioniert:

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

Die Lösung erscheint basiert weg zu der empfohlene Ansatz in der Dokumentation Alamofire detailliert hier: 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

Dies hilft mir:

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