2017-08-15 3 views
0

tout d'abord permet de regarder le code:Télécharger image pour serveur en utilisant retrofit 2

public interface ApiInterface { 
    @Multipart 
    @POST("my/files/photo/") 
    Call<FileUploadResponse> uploadPhoto(@Header("authorization") String auth, 
            @Part MultipartBody.Part file, 
            @Part("file-type") RequestBody fileType); 
} 

J'appelle cette interface comme ceci:

RequestBody body = RequestBody.create(MediaType 
      .parse(getContentResolver().getType(fileUri)), file); 
MultipartBody.Part avatarBody = MultipartBody.Part 
      .createFormData(data, file.getName(), body); 
RequestBody fileType = RequestBody.create(
      MediaType.parse("text/plain"), "profile"); 
client.uploadPhoto(getToken(), avatarBody, fileType); 

De serveur je reçois la réponse que "Type de fichier non fourni". Si je change de place de fichier et filetype sur la fonction uploadPhoto comme ceci:

@Multipart 
@POST("my/files/photo/") 
Call<FileUploadResponse> uploadPhoto(@Header("authorization") String auth, 
           @Part("file-type") RequestBody fileType 
           @Part MultipartBody.Part file); 

Je reçois une réponse « Fichier non fourni ». J'ai vérifié serveur avec mon propre code écrit sur JS:

<!DOCTYPE html> 
 
<script language="JavaScript" type="text/javascript" src="C://Users/User/Downloads/jquery-3.2.1.min.js"></script> 
 

 
<form action=""> 
 
    <input type="text" name="authorize" id="authorize"> 
 
    <br> 
 
    <input type="file" name="photo" accept="image/*" id="filechooser" onchange="onFileChange(this)" > 
 
    <br> 
 
    <input value="profile" type="text" name="file-type" id="type"> 
 
    <br> 
 
    <input type="button" onclick="uploadFile()"> 
 
</form> 
 

 

 
<script> 
 
var blobFile; 
 
function onFileChange(ss) { 
 
\t blobFile = ss.files[0]; 
 
\t alert(blobFile); 
 
} 
 
function uploadFile() { 
 

 
\t var storedJWT = $('#authorize').val(); 
 
\t var fileType = $('#type').val(); 
 
    var formData = new FormData(); 
 
    formData.append("file-type", fileType); 
 
\t formData.append("photo", blobFile); 
 
\t console.log(storedJWT); 
 
    $.ajax({ 
 
     url: "url", 
 
     type: "POST", 
 
     data: formData, 
 
\t headers: { 
 
     authorization: storedJWT 
 
\t }, 
 
     processData: false, 
 
     contentType: false, 
 
     success: function(response) { 
 
\t \t console.log(response); 
 
     }, 
 
     error: function(jqXHR, textStatus, errorMessage) { 
 
      console.log(errorMessage); 
 
     } 
 
    }); 
 
}</script>

tout va bien travailler. Script sur demande de génération JS comme ceci:

Accept:*/* 
Accept-Encoding:gzip, deflate 
Accept-Language:en-US,en;q=0.8 
authorization:JWT token 
Connection:keep-alive 
Content-Length:67601 
Content-Type:multipart/form-data; boundary=---- 
WebKitFormBoundary3MtpMA70hG41luF1 
Host:localhost 
------WebKitFormBoundary3MtpMA70hG41luF1 
Content-Disposition: form-data; name="file-type" 

profile 
------WebKitFormBoundary3MtpMA70hG41luF1 
Content-Disposition: form-data; name="photo"; filename="1231231313.jpg" 
Content-Type: image/jpeg 


------WebKitFormBoundary3MtpMA70hG41luF1-- 

et la demande de rattrapage est:

Content-Type: multipart/form-data; boundary=238182ad-d99c-4d44-9ba6-7d178a14b2e9 
Content-Length: 59776 
authorization: JWT token 
--238182ad-d99c-4d44-9ba6-7d178a14b2e9 
Content-Disposition: form-data; name="photo"; filename="1502703422332.jpg" 
Content-Type: image/jpeg 
Content-Length: 59369 
//bytes 
--238182ad-d99c-4d44-9ba6-7d178a14b2e9 
Content-Disposition: form-data; name="file-type" 
Content-Transfer-Encoding: binary 
Content-Type: text/plain; charset=utf-8 
Content-Length: 7 
profile 
--238182ad-d99c-4d44-9ba6-7d178a14b2e9-- 

Je ne comprends pas où peut être l'erreur ...

Répondre

0

Après beaucoup de recherche, je trouve que serveur ne gère pas les en-têtes comme

Content-Transfer-Encoding: binary 
Content-Type: text/plain; charset=utf-8 

et je dois supprimer ces en-têtes de ma demande. Et la solution est fonction de création de téléchargement dans mon interface API comme ceci:

@POST("my/files/photo/") 
    Call<FileUploadResponse> uploadPhoto(@Header("Content-Type") String contentType, 
              @Header("Authorization") String auth, 
              @Body MultipartBody body); 

et appeler cette fonction comme:

ApiClient.ApiInterface client = ApiClient.getClient(); 
File file = new File(getPathFromUri(fileUri)); 
RequestBody fileBody = RequestBody.create(MediaType.parse(getContentResolver().getType(fileUri)), file); 
MultipartBody body = new MultipartBody.Builder().addFormDataPart("file-type", "profile") 
       .addFormDataPart("photo", "image.png", fileBody) 
       .build(); 
client.uploadPhoto("multipart/form-data; boundary=" + body.boundary(), 
        PrefManager.getInstance().getToken(), body); 

En conséquence je reçois demande ci-dessous:

Content-Type: multipart/form-data; boundary=27ec8d66-d29d-48aa-a2fe-08c6664b10c7 
Content-Length: 56412 
Authorization: JWT token 
--27ec8d66-d29d-48aa-a2fe-08c6664b10c7 
Content-Disposition: form-data; name="file-type" 
Content-Length: 7 
profile 
--27ec8d66-d29d-48aa-a2fe-08c6664b10c7 
Content-Disposition: form-data; name="photo"; filename="image.png" 
Content-Type: image/jpeg 
Content-Length: 56089 
/* bytes */ 
--27ec8d66-d29d-48aa-a2fe-08c6664b10c7-- 

Et fonctionne bien.