当前位置: 首页 > 知识库问答 >
问题:

使用alamofire上传图像

谷博艺
2023-03-14

我正试图用Alamofire将图像上传到服务器,但我的代码不起作用。这是我的代码:

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方法:

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

这就是我在控制台得到的:

请求{URL:http://tranthanhphongcntt.esy.es/task_manager/IOSFileUpload/ }响应可选({URL:http://tranthanhphongcntt.esy.es/task_manager/IOSFileUpload/ }{状态代码:200,标题{“接受范围”=字节;连接=关闭;“内容长度”=345;“内容类型”=“文本/html”;日期=“周二,2015年8月25日10:52:01 GMT”;“Last Modified”=“Mon,2015年8月24日03:54:55 GMT”;Server=Apache;}})JSON nil错误可选(错误域=NSCOCAERRORDOMAIN Code=3840”操作无法完成。(Cocoa错误3840.)(字符0周围的值无效。)用户信息=0x7f8c68c1c130{NSDebugDescription=字符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上传带有参数的文件。请帮助我,谢谢

共有3个答案

笪栋
2023-03-14

SWIFT 2 AlamoFire图像上传至REST API的总体解决方案

AlamoFire包含简化解决方案的负载。lamofire.request方法包含几个简化的重载,可以使用它们以简单的方式上载。通过使用lamofire.request(方法开发人员可以摆脱编码开销。

请在下面检查我的解决方案。

该解决方案在SWIFT 2.0上进行了测试

import UIKit
import Alamofire

class ViewController: UIViewController {

    @IBOutlet var imageView: UIImageView!
    @IBOutlet var btnUpload: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func successDataHandler(responseData:String){

        print ("IMAGE UPLOAD SUCCESSFUL    !!!")

    }

    func failureDataHandler(errorData:String){

        print ("  !!!   IMAGE UPLOAD FAILURE   !!! ")

    }

    @IBAction func actionUpload(sender: AnyObject) {

        let URL = "http://m8coreapibeta.azurewebsites.net/api/cards/SaveImages"

        let postDataProlife:[String:AnyObject] = ["CardId":(dataCardDetail?.userId)!,"ImageType":1,"ImageData":imageView.image!]

        uplaodImageData(URL, postData: postDataProlife, successHandler: successDataHandler, failureHandler: failureDataHandler)
    }

    func uplaodImageData(RequestURL: String,postData:[String:AnyObject]?,successHandler: (String) -> (),failureHandler: (String) -> ()) -> () {

        let headerData:[String : String] = ["Content-Type":"application/json"]

        Alamofire.request(.POST,RequestURL, parameters: postData, encoding: .URLEncodedInURL, headers: headerData).responseString{ response in
            switch response.result {
            case .Success:
                print(response.response?.statusCode)
                successHandler(response.result.value!)
            case .Failure(let error):
                failureHandler("\(error)")
            }
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
卢宜然
2023-03-14

您的错误是告诉您响应不是有效的JSON。您正在调用响应JSON,表明您期待JSON响应,但您的服务器代码没有生成JSON。所以有两种解决方案:

>

例如,如果成功:

echo json_encode(array("success"    => true,
                       "filename"   => basename($_FILES['image']['name']));

或者,如果不成功,也许:

echo json_encode(array("success"    => false,
                       "error_code" => 42,
                       "error_msg"  => 'File did not upload: '.$e - > getMessage());

显然,如果要返回JSON,必须删除PHP中无关的echo行,但希望这能说明这种模式。但这将生成一个响应,您可以使用Alamofire的responseJSON(或使用NSJSONSerialization)解析该响应。

或者,您可以将Alamofire代码更改为不需要JSON(例如,调用response,而不是responseJSON),但是解析响应变得更加困难。

作为一个次要的、不相关的问题,我个人建议不要手动构建这个请求,而是让阿拉莫费尔为你做这件事。这里有一个README的例子:

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

这是给Swift 3和Alamofire 4的。有关以前的版本,请参阅此问题的修订历史。

姬银龙
2023-03-14

虽然Rob的回答是正确的,但下面是Swift 2.0版本,其中包含上载进度更新。

只需复制并粘贴以下代码,更改上传URL,并添加参数。应该像魅力一样工作。

PS:MRProgress是一个非常棒的进度更新库!

    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");
            }
        }
    );
 类似资料:
  • 问题内容: 我正在使用以下代码将单个图像上传到服务器: 如何通过编辑此代码在单个参数中上传多张图片? 问题答案: Swift 3 只需在图像上传参数中使用“ []”即可使其成为图像数组。

  • 我在试图让Alamofire上传图像时被困了三天。其想法是,Alamofire将使用一些php代码将其发送到服务器。在不同的地方进行了大量的尝试和研究之后,一些代码应该可以工作,但是Alamofire的服务器端文档非常糟糕。 Swift 3最近的更新对明智的回答没有多大帮助... 这是我的Swift 3代码: 这应该上传到服务器上的图像,但我不知道如何正确地将图像保存在服务器上。服务器实际上不需要

  • 我正在使用Alamofire向服务器发送数据。我有一个图像,我想上传到服务器的数据形式与一些其他参数。在Alamofire中,我使用multipartFormData方法发布所有参数和图像。服务器需要数据为JSON格式,参数如下所示: 我正在努力,但它给了我一个失败的回应。以下是我在swift中与alamofire合作的代码: 我的服务器接受BLOB数据中的映像。如果有人能帮我。非常感谢。

  • 我试图使用AlamoFire将图像(avatarImage)作为formData参数类型上载到服务器,但每次我尝试发布时都会生成一个“数据无法读取,因为它的格式不正确”错误。我不太清楚我做错了什么。 PS:我正在使用multipartFormData上载b/c,我还需要发送一些其他参数(一旦我能够上载图像)。

  • 我尝试用Alamofire上传数据 问题是:若我尝试从项目上传图像,它工作正常,但若我尝试上传zip目录,我得到了错误和超时异常 这是我的代码,它产生超时异常 这是一段运行良好的代码 我试图将Data()传递给我还试图传递对zip-dit的引用以上传请求,我还尝试了

  • 我正在用Swift开发一个iPhone应用程序。我正在使用Alamofire框架来处理http请求。我将用于POST,GET等,如下所示: 我使用将图像上载到服务器: 谁能帮我解决这个问题? 谢谢!:)