Swift-Upload multiple images to server

烈酒焚心 提交于 2019-12-11 13:54:35

问题


I have been trying to upload multiple images to server in swift. This is my code:

Swift:

 var images: Int16 = 0
 var params: NSMutableDictionary = NSMutableDictionary()
 var imageDataArray = [UIImage]()

    func syncFile() {
    let myUrl = NSURL(string: "http://localhost/app/imageUpload.php")

    let request = NSMutableURLRequest(URL: myUrl!)
    request.HTTPMethod = "POST"

    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
    let authToken = prefs.valueForKey("authToken") as! String

    let boundary = generateBoundaryString()


    request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
switch images {
    case 0:
        imageDataArray = []
    case 1:
        imageDataArray.append(self.imageView1.image!)
    case 2:
        imageDataArray.append(self.imageView1.image!)
        imageDataArray.append(self.imageView2.image!)
    case 3:
        imageDataArray.append(self.imageView1.image!)
        imageDataArray.append(self.imageView2.image!)
        imageDataArray.append(self.imageView3.image!)
    default:
        break
    }


    params = [
        "auth_code"   :  "\(authToken)",
        "id"          :  "\(idParam)",
        "file"        :  imageDataArray
        ]
request.HTTPBody = createBodyWithParameters(params, filePathKey: "file", boundary: boundary)

func createBodyWithParameters(parameters: NSMutableDictionary?, filePathKey: String?, boundary: String) -> NSData {

    let body = NSMutableData()

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

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

                    let mimetype = mimeTypeForPath(filename)

                    let fileKey = "file"

                    body.appendString("--\(boundary)\r\n")
                    body.appendString("Content-Disposition: form-data; name=\"\(fileKey)\"; filename=\"\(filename)\"\r\n")
                    body.appendString("Content-Type: \(mimetype)\r\n\r\n")
                    body.appendData(data!)
                    body.appendString("\r\n")
                    i = i + 1
                }
            }
        }
    }
    body.appendString("--\(boundary)--\r\n")

    return body
}

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

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!, nil)?.takeRetainedValue() {
        if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() {
            stringMimeType = mimetype as NSString as String
        }
    }
    return stringMimeType;
}

And here is my PHP code:

<?php
header('Content-type: application/json');
$target_dir = "uploads";

if(!file_exists($target_dir))
{
 mkdir($target_dir, 0777, true);
}
$total = count($_FILES["file"]["name"]);
for($i=0; $i < $total; $i++){

$target_dir1 = $target_dir . "/" . basename($_FILES["file"]["name"][$i]);

if (move_uploaded_file($_FILES["file"]["tmp_name"][$i], $target_dir1)) 
{
    echo json_encode([
    "Message" => "The file ". basename( $_FILES["file"]["name"][$i]). " has been uploaded.",
    "Status" => "OK"
    ]);

} else {

    echo json_encode([
    "Message" => "Sorry, there was an error uploading your file.",
    "Status" => "Error"
    ]);

}


}
?>

But, when I print out the response data, I am getting error: {"Message":"Sorry, there was an error uploading your file.","Status":"Error"}

However, if I remove the loop from php code and upload just 1 image with the same swift code, it successfully uploads that image.

来源:https://stackoverflow.com/questions/37292632/swift-upload-multiple-images-to-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!