【问题标题】:Upload image with Alamofire with MultiFormData使用 Alamofire 和 MultiFormData 上传图像
【发布时间】:2016-12-19 03:37:53
【问题描述】:

我正在尝试使用服务器上传图片。 在 Android 中,它与以下代码完美配合:

RestTemplate restTemplate = new RestTemplate();

MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
String strPath = "D:\\Personal\\Projects\\Resources\\Images\\ic_flash_on.png";
Path path = Paths.get(strPath);
byte[] bytes = Files.readAllBytes(path);

map.add("id", 2);
map.add("file", new ByteArrayResource(bytes) {
  @Override
  public String getFilename() {
    return "ic_flash_on.png";
  }
});

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
headers.add("Authorization", request.getHeader("Authorization"));

HttpEntity<MultiValueMap<String, Object>> imageEntity = new HttpEntity<MultiValueMap<String, Object>>(map, headers);
ResponseEntity<Photo> result = restTemplate.exchange("http://localhost:8080/api/photos/upload", HttpMethod.POST,
    imageEntity, Photo.class);
return result;

在 iOS 中,我使用 Alamofire 和代码:

let url = HOST + "api/photos/upload"

    let accessToken = KeychainHelper.getStringForKey(KeychainConstaint.kAccessTokenKey) ?? ""
    let headers = [
        "Authorization": "Bearer \(accessToken)",
        "Content-Type": "multipart/form-data"
    ]

    Alamofire.upload(
        .POST,
        url,
        headers: headers,
        multipartFormData: { multipartFormData in
            var id = 10000
            let idData = NSData(bytes: &id, length: sizeof(Int))
            //multipartFormData.appendBodyPart(data: photo.data, name: "file")
            multipartFormData.appendBodyPart(data: idData, name: "id")
            multipartFormData.appendBodyPart(data: photo.data, name: "file", fileName: ".jpg", mimeType: "image/jpeg")
        },
        encodingMemoryThreshold: Manager.MultipartFormDataEncodingMemoryThreshold) { encodingResult in
            switch encodingResult {
            case .Success(let upload, _, _):
                upload.responseJSON { response in
                    debugPrint(response)
                }
            case .Failure(let encodingError):
                print(encodingError)
            }
    }

它失败的原因是:“所需的 MultipartFile 参数‘文件’不存在”

我错过了什么吗? :(

【问题讨论】:

  • 我听到了你的挣扎,我今天遇到了类似的问题。就我而言,它与 multipartFormData.append() 调用中的参数“withName”和“fileName”有关。我建议,如果您可以控制 Spring 后端,则添加一个带有断点的“过滤器”类,您可以在其中调查“好”和“坏”请求以查看到底有什么不同(它将在之前到达断点失败并显示该错误消息)。
  • 嗨。我发现 fileName: 不应该像这样“.jpg”格式。我在该函数中与“名称”参数和“文件名”冲突。

标签: ios swift image-uploading alamofire multipartform-data


【解决方案1】:
let url = HOST + "api/photos/upload"

let accessToken = KeychainHelper.getStringForKey(KeychainConstaint.kAccessTokenKey) ?? ""
let headers = [
    "Authorization": "Bearer \(accessToken)",
    "Content-Type": "multipart/form-data"
]

var parameters = [String:AnyObject]()

var id = 10000
let idData = NSData(bytes: &id, length: MemoryLayout<Int>.size)

parameters = ["id":idData as AnyObject]

Alamofire.upload(multipartFormData: { multipartFormData in

    multipartFormData.append(photo.data , withName: "image" , fileName: ".jpeg", mimeType: "image/jpeg")
    // + sessionid + "/" + mobile
    for (key, value) in parameters {
        multipartFormData.append(value.data(using: String.Encoding.utf8.rawValue)!, withName: key)
    }

},to: url, method: .post, headers: nil ,
  encodingCompletion: { encodingResult in
    switch encodingResult {
    case .success(let upload, _, _):
        upload.response { [weak self] response in
            guard self != nil else {
                return
            }
            debugPrint(response)
        }
    case .failure(let encodingError):
        print("error:\(encodingError)")
    }


})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多