2016-08-12 84 views
0

我正在尝试上传图片与服务器。 在Android中,它的工作完美与此代码:用Alamofire和MultiFormData上传图片

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参数 '文件' 是不是礼物“

我错过了什么吗? :(

+0

我听到你们的斗争,我有现在的样子看起来像一个类似的问题。对我来说,它与参数“withName”和“文件名”中multipartFormData.append()调用来完成。 我会建议,如果你有控制Spring后端,添加一个带有断点的“Filter”类,你可以调查'好'和'坏'请求,看看到底有什么不同(它会到达断点 – MikaelW

+0

嗨,我发现文件名:不应该格式化为这样的“.jpg” 我在该函数中冲突了'name'参数和'fileName'。 –

回答

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


})