2017-07-11 289 views
0

看来这个问题以前已经问过,但没有答案对我很有帮助。我有一个应用程序,我创建了自己的ImagePicker以从用户的相机胶卷中选择多个图像。我现在需要将这些图像上传到PHP脚本。当我只需要上传一张图片时,一切正常。事情是,我不知道如何更改我的代码上传多个图像。从Swift上传多张图片到PHP

码开始后(仅上传相关的最重要的代码)

let param = ["request":"uploadImagesAndParams", "someParam": self.txtSomeTextField.text!] 

     let boundary = generateBoundaryString() 

     request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 

     //Here I am just selecting the first image in my UIImage array (selectedImages). I need to be able to select all of them and upload it. 
     let imageData = UIImageJPEGRepresentation((selectedImages?[0])!, 1) 

     if(imageData == nil) { return; } 

     request.httpBody = createBodyWithParameters(parameters: param, 
                filePathKey: "image", 
                imageDataKey: imageData! as NSData, 
                boundary: boundary) as Data 

代码上传

//Upload Function 
    func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData { 
     let body = NSMutableData(); 

     if parameters != nil { 
      for (key, value) in parameters! { 
       body.appendString(string: "--\(boundary)\r\n") 
       body.appendString(string: "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") 
       body.appendString(string: "\(value)\r\n") 
      } 
     } 

     let filename = "user-profile.jpg" 
     let mimetype = "image/jpg" 

     body.appendString(string: "--\(boundary)\r\n") 
     body.appendString(string: "Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n") 
     body.appendString(string: "Content-Type: \(mimetype)\r\n\r\n") 
     body.append(imageDataKey as Data) 
     body.appendString(string: "\r\n") 



     body.appendString(string: "--\(boundary)--\r\n") 

     return body 
    } 



    func generateBoundaryString() -> String { 
     return "Boundary-\(NSUUID().uuidString)" 
    } 
+1

检查这个问题,答案https://stackoverflow.com/questions/43972651/multiple-file-upload-with-array -of-参数-使用-alamofire/43972778#43972778。它应该给你如何实现这一目标的总体思路。 –

+0

这个问题是使用Alamofire。 –

+0

答案专注于'Operation'而不是'Alamofire'。你可以使用这个概念。其余的是实现细节。 –

回答

0

我想通了,这样做没有进行操作的方式。下面的方法会将多个图像上传到PHP服务器。希望这可以帮助别人。

导入以下

import MobileCoreServices 

添加以下

var selectedImages: [UIImage]? 
var params: NSMutableDictionary = NSMutableDictionary() 

功能发出请求

function upload() { 
      // Retrieve server URL 
      let serverUrl = dbConn.OnlineDBConnectionString() 

      // Define server side script URL 
      let scriptUrl = serverUrl + "evalue8_api.php" 

      let myUrl = NSURL(string: scriptUrl); 

      let request = NSMutableURLRequest(url:myUrl! as URL); 
      request.httpMethod = "POST"; 

      //Note the [] after image 
      params = ["someVariable": self.txtMytextfield.text!, "image[]": selectedImages!] 

      let boundary = generateBoundaryString() 

      request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 

      request.httpBody = createBodyWithParameters(parameters: params, boundary: boundary) as Data 

      _ = URLSession.shared.dataTask(with: request as URLRequest) { 
       data, response, error in 

       if error != nil { 
        print("Error=\(error!)") 
        return 
       } 

       do { 
        let parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! NSDictionary 

        //print(parsedData) 
        let success = parsedData["response"] as! Bool 

        DispatchQueue.main.async { 
         if (success) { 
          //Do something 
         } 
        } 
       } catch { 
        print(error.localizedDescription) 
       } 
      }.resume() 
     } 

其他需要的功能

//Upload Function 
    func createBodyWithParameters(parameters: NSMutableDictionary?, boundary: String) -> NSData { 
     let body = NSMutableData() 

     if parameters != nil { 
      for (key, value) in parameters! { 

       if(value is String || value is NSString){ 
        body.appendString(string: "--\(boundary)\r\n") 
        body.appendString(string: "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") 
        body.appendString(string: "\(value)\r\n") 
       } 
       else if(value is [UIImage]){ 
        var i = 0; 
        for image in value as! [UIImage]{ 
         let filename = "image\(i).jpg" 
         let data = UIImageJPEGRepresentation(image,1); 
         let mimetype = mimeTypeForPath(path: filename) 

         body.appendString(string: "--\(boundary)\r\n") 
         body.appendString(string: "Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(filename)\"\r\n") 
         body.appendString(string: "Content-Type: \(mimetype)\r\n\r\n") 
         body.append(data!) 
         body.appendString(string: "\r\n") 
         i += 1; 
        } 
        print(i) 
       } 
      } 
     } 
     body.appendString(string: "--\(boundary)--\r\n") 
     return body 
    } 

    func mimeTypeForPath(path: String) -> String { 
     let pathUrl = NSURL(string: path) 

     let pathExtension = pathUrl!.pathExtension 
     var stringMimeType = "application/octet-stream" 
     if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension! as CFString, nil)?.takeRetainedValue() { 
      if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() { 
       stringMimeType = mimetype as NSString as String 
      } 
     } 
     return stringMimeType; 
    } 

    func generateBoundaryString() -> String { 
     return "Boundary-\(NSUUID().uuidString)" 
    } 

Extention需要

extension NSMutableData { 

    func appendString(string: String) { 
     let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true) 
     append(data!) 
    } 
} 
0

这里是Alamofire

的片段上传多个图像上传

假设你有数组要上传到服务

for aIndex in 0..<imgArray.count{ 
    if let imageData = UIImageJPEGRepresentation(imgArray[aIndex], 0.5) { 
     multipartFormData.append(imageData, withName: "Image\(aIndex).jpg") 
     } 
    } 

希望的图像,这将帮助你

+0

我没有使用Alamofire。你有没有做过这个没有Alamofire? –