Skip to main content
 首页 » 操作系统

iphone之使用 Swift 上传多个图像文件

2024年01月01日38qq号

我使用以下代码将单个图像上传到服务器(带参数),但是我一直在尝试上传多个图像,但无法让它工作

创建 NSData 对象(保存在临时目录中的图像)。使用网络数据类 here

    func uploadData(){ 
    //create image data objects 
    let filemanager:NSFileManager = NSFileManager() 
    let files = filemanager.enumeratorAtPath(tempPicPath) 
    var counter:Int = Int() 
    while let file: AnyObject = files?.nextObject() { 
        imagePathCollection.append(tempPicPath + "/" + (file as NSString)) 
    } 
 
    //convert to data objects () 
    for path in imagePathCollection{ 
        var image: UIImage? = UIImage(contentsOfFile: path) 
        if image != nil { 
            var sizeOfImage = image?.size 
            var resizedImage = RBSquareImageTo(image!, sizeOfImage!) 
            var imageData = UIImageJPEGRepresentation(resizedImage, 75) 
            imageDataCollection.append(NetData(data: imageData!, mimeType:MimeType(rawValue: "image/jpeg")!, filename: "myImage.jpeg")) 
        } 
    } 
 
    if(imageDataCollection.count > 1){ 
        for (index, element) in enumerate(imageDataCollection) { 
            multipleImageUpload(imageDataCollection[index]) 
        } 
    }else{ 
        singleImageUpload(imageDataCollection[0]) 
    } 
} 

使用Alamofire上传

        func extrasImageUpoload(urlRequest:(URLRequestConvertible, NSData))->Request{ 
    let request = Alamofire.upload(urlRequest.0, urlRequest.1) 
        .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in 
            println("progress : \(totalBytesWritten) / \(totalBytesExpectedToWrite)") 
    } 
    return request 
} 

生成 Alamofire 请求

    func urlRequestWithComponents(parameters:NSDictionary, uploadType:String) -> (URLRequestConvertible, NSData) { 
 
    var mutableURLRequest:NSMutableURLRequest = NSMutableURLRequest() 
 
    //set url type 
    if(uploadType == "extra"){ 
        mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: baseURL + "ticket/extra")!) 
    }else if(uploadType == "checkList"){ 
        //uploadUrl = "ticket/mark" 
        mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: baseURL + "ticket/mark")!) 
    } 
 
    // create url request to send 
    //var mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: baseURL + "ticket/extra")!) 
    mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue 
    //let boundaryConstant = "myRandomBoundary12345" 
    let boundaryConstant = "NET-POST-boundary-\(arc4random())-\(arc4random())" 
    let contentType = "multipart/form-data;boundary="+boundaryConstant 
    //let pgToken = "c9049df83e8bfd7a3dfaef279cdb74478330ff2a" 
    mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type") 
    mutableURLRequest.setValue(self.token, forHTTPHeaderField: "PG-Auth-Token") 
 
    // create upload data to send 
    let uploadData = NSMutableData() 
 
    // add parameters 
    for (key, value) in parameters { 
 
        uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
 
        if value is NetData { 
            // add image 
            var postData = value as NetData 
            //uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(postData.filename)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)! 
            var filenameClause = " filename=\"\(postData.filename)\"" 
            let contentDispositionString = "Content-Disposition: form-data; name=\"\(key)\";\(filenameClause)\r\n" 
            let contentDispositionData = contentDispositionString.dataUsingEncoding(NSUTF8StringEncoding) 
            uploadData.appendData(contentDispositionData!) 
 
 
            // append content type 
            //uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
            let contentTypeString = "Content-Type: \(postData.mimeType.getString())\r\n\r\n" 
            let contentTypeData = contentTypeString.dataUsingEncoding(NSUTF8StringEncoding) 
            uploadData.appendData(contentTypeData!) 
            uploadData.appendData(postData.data) 
 
        }else{ 
            uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!) 
        } 
    } 
    uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
 
    // return URLRequestConvertible and NSData 
    return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData) 
} 

参数数组和 NSData 集合如下所示

 var params = ["pic":imageData,"ticketid":ticketID, "appversion":Utilities().getAPPVersion(), "description":"bla bla bla", "cost":50] 

"imageData"是图像的 NSData 对象的集合。代码工作正常,但接收到的图像的 NSData 数组为空数组。然而,包括“appversion”和“description”在内的其余参数将被正常接收

请您参考如下方法:

import MobileCoreServices 
 
 
func createRequest(userid: String, image: [UIImage]) throws -> NSMutableURLRequest { 
 
   var parameters: [String : AnyObject] = [ 
       "userid": userid, 
       "Image1": image[0],  // You need to set the UIImage Type image parameters  
       "Image2": image[1],    
       "Image3": image[2], 
       "Image4": image[3] 
   ] 
 
    print(parameters) 
 
    let boundary = generateBoundaryString() 
 
    let url = URL(string: Your URL String)! 
    let request = NSMutableURLRequest(url: url) 
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 
 
    request.httpBody = try createBody(with: parameters as [String : AnyObject], boundary: boundary) 
 
    return request 
} 

这里是multipart/form-data中上传图片和参数的代码

func createBody(with parameters: [String: AnyObject], boundary: String) throws -> Data { 
 
    var body = Data() 
 
    for (key, value) in parameters { 
 
        if(value is String || value is NSString) { 
            body.append("--\(boundary)\r\n") 
            body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") 
            body.append("\(value)\r\n") 
        }else if let image = value as? UIImage { 
            let r = arc4random() 
            let filename = "image\(r).jpg" 
            let data = UIImageJPEGRepresentation(image,1); 
            let mimetype = mimeTypeForPath(path: filename) 
 
            body.append("--\(boundary)\r\n") 
            body.append("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(filename)\"\r\n") 
            body.append("Content-Type: \(mimetype)\r\n\r\n") 
            body.append(data!) 
            body.append("\r\n") 
        } 
 
    } 
 
    body.append("--\(boundary)--\r\n") 
 
    return body 
 
} 
 
func mimeTypeForPath(path: String) -> String { 
    let pathExtension = path.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; 
} 
 
extension String { 
   var ns: NSString { 
       return self as NSString 
   } 
   var pathExtension: String? { 
       return ns.pathExtension 
   } 
   var lastPathComponent: String? { 
       return ns.lastPathComponent 
   } 
}