2016-08-12 85 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)") 
    } 


})