2016-08-12 3 views
0

Ich versuche, Bild mit Server hochzuladen. In Android, es mit diesem Code perfekt arbeiten:Bild mit Alamofire mit MultiFormData hochladen

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; 

In iOS, ich bin mit Alamofire mit Code:

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

Und mit Grund fehlschlagen: „Erforderlich MultipartFile Parameter 'Datei' nicht Geschenk "

Habe ich etwas vermisst? :(

+0

ich Ihren Kampf höre, hatte ich, was heute wie ein ähnliches Problem sieht. In meinem Fall hatte es mit dem Parameter „withname“ und „filename“ in der multipartFormData.append() Aufruf zu tun. Ich würde vorschlagen, wenn Sie Kontrolle über die Spring-Back-End, eine "Filter" -Klasse mit einem Haltepunkt hinzufügen, wo Sie sowohl die "guten" als auch "schlechte" Anfragen untersuchen können, um genau zu sehen, was anders ist (es wird den Haltepunkt erreichen bevor ich mit dieser Fehlermeldung scheiterte). – MikaelW

+0

Hi. Ich fand diesen fileName: sollte nicht wie dieses ".jpg" formatieren. Ich war Konflikt der 'Name' Parameter und 'fileName' in dieser Funktion. –

Antwort

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


})