使用alamofire上传图片 [英] Upload image with alamofire

查看:88
本文介绍了使用alamofire上传图片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Alamofire将图像上传到服务器,但是我的代码无效。这是我的代码:

I'm trying to upload an image to server with Alamofire but my code doesn't work. This is my code:

var parameters = ["image": "1.jpg"]
    let image = UIImage(named: "1.jpg")
    let imageData = UIImagePNGRepresentation(image)
    let urlRequest = urlRequestWithComponents("http://tranthanhphongcntt.esy.es/task_manager/IOSFileUpload/", parameters: parameters, imageData: imageData)
    Alamofire.upload(urlRequest.0, data: urlRequest.1)
        .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
            println("\(totalBytesWritten) / \(totalBytesExpectedToWrite)")
        }
        .responseJSON { (request, response, JSON, error) in
            println("REQUEST \(request)")
            println("RESPONSE \(response)")
            println("JSON \(JSON)")
            println("ERROR \(error)")
    }

这是urlRequestWithComponents方法:

and this is urlRequestWithComponents methos:

func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData) -> (URLRequestConvertible, NSData) {

    // create url request to send
    var 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()

    // add image
    uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    uploadData.appendData("Content-Disposition: form-data; name=\"file\"; filename=\"file.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)!)



    // return URLRequestConvertible and NSData
    return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
}

这就是我在控制台中看到的内容:

and this is what I get in console:


请求{URL: http:// tranthanhphongcntt .esy.es / task_manager / IOSFileUpload / }
响应可选({URL: http://tranthanhphongcntt.esy.es/task_manager/IOSFileUpload/ } {状态代码:200,标头{
Accept-Ranges =字节;
连接=关闭;
Content-Length = 345;
Content-Type =文本/ html;
Date =星期二,2015年8月25日10:52:01 GMT;
Last-Modified =星期一,2015年8月24日03:54:55 GMT;
服务器= Apache;
JSON nil
错误可选(错误域= NSCocoaErrorDomain代码= 3840操作无法完成。(可可错误3840。)(字符0周围的无效值。 )UserInfo = 0x7f8c68c1c130 {NSDebugDescription =字符0周围的值无效。})

REQUEST { URL: http://tranthanhphongcntt.esy.es/task_manager/IOSFileUpload/ } RESPONSE Optional( { URL: http://tranthanhphongcntt.esy.es/task_manager/IOSFileUpload/ } { status code: 200, headers { "Accept-Ranges" = bytes; Connection = close; "Content-Length" = 345; "Content-Type" = "text/html"; Date = "Tue, 25 Aug 2015 10:52:01 GMT"; "Last-Modified" = "Mon, 24 Aug 2015 03:54:55 GMT"; Server = Apache; } }) JSON nil ERROR Optional(Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x7f8c68c1c130 {NSDebugDescription=Invalid value around character 0.})

我的PHP内容:

<? php
echo $_FILES['image']['name'].
'<br/>';


//ini_set('upload_max_filesize', '10M');
//ini_set('post_max_size', '10M');
//ini_set('max_input_time', 300);
//ini_set('max_execution_time', 300);


$target_path = "uploads/";

$target_path = $target_path.basename($_FILES['image']['name']);

try {
  //throw exception if can't move the file
  if (!move_uploaded_file($_FILES['image']['tmp_name'], $target_path)) {
    throw new Exception('Could not move file');
  }

  echo "The file ".basename($_FILES['image']['name']).
  " has been uploaded";
} catch (Exception $e) {
  die('File did not upload: '.$e - > getMessage());
} ?>

我的代码遵循以下建议:使用Alamofire上传带有参数的文件
。请帮助我,谢谢

My code followed this suggestion: Uploading file with parameters using Alamofire .Please help me, thanks

推荐答案

Rob的答案是正确的,这是 Swift 2.0 版本,并具有上传进度更新。

While Rob's Answer is correct, here's the Swift 2.0 version, with upload progress update.

只需复制并粘贴以下代码,更改上传URL,然后添加参数。

Just Copy and Paste the following code, change the upload URL, and add in your parameters. Should work like a charm.

PS: MRProgress

PS: MRProgress is an Awesome Library for progress update!

    let apiToken = "ABCDE"
    Alamofire.upload(
        .POST,
        "http://sample.com/api/upload",
        multipartFormData: { multipartFormData in
            multipartFormData.appendBodyPart(data: imageData, name: "yourParamName", fileName: "imageFileName.jpg", mimeType: "image/jpeg")
            multipartFormData.appendBodyPart(data: apiToken.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"api_token")
            multipartFormData.appendBodyPart(data: otherBodyParamValue.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"otherBodyParamName")
        },
        encodingCompletion: { encodingResult in
            switch encodingResult {
            case .Success(let upload, _, _):
                upload.progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
                    print("Uploading Avatar \(totalBytesWritten) / \(totalBytesExpectedToWrite)")
                    dispatch_async(dispatch_get_main_queue(),{
                        /**
                        *  Update UI Thread about the progress
                        */
                    })
                }
                upload.responseJSON { (JSON) in
                    dispatch_async(dispatch_get_main_queue(),{
                        //Show Alert in UI
                        print("Avatar uploaded");
                    })
                }

            case .Failure(let encodingError):
                //Show Alert in UI
                print("Avatar uploaded");
            }
        }
    );

这篇关于使用alamofire上传图片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆