2017-12-26 8 views
1

Ich möchte die Upload-Datei auf den Server mit Retrofit umschreiben.Datei auf den Server hochladen mit Retrofit welcher Inhalt in JSON verpackt ist

Der Server api Anfrage für Körper

{“file_name”: “my_pic”, “content_base64”: “MKMD….”} 

Vor dem Hochladen muß auch das Bild komprimieren und auch den Inhalt kodieren. Unsere aktuelle Implementierung ist:

Bitmap bmp = BitmapFactory.decodeFile(localPath); 
ByteArrayOutputStream outputStream= new ByteArrayOutputStream(); 
bmp.compress(Bitmap.CompressFormat.JPEG, 80, outputStream); 
byte[] byteArrayImage = outputStream.toByteArray(); 
String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT); 

JSONObject jObject = new JSONObject(); 

    try { 
     jObject.put("file_name", "test.jpg"); 
     jObject.put("content_base64", encodedImage); 
     String jObjectString = jObject.toString(); 
     URL url = new URL(serverPath); 
     ... 
     connection.setRequestMethod("PUT"); 
     connection.setUseCaches(false); 
     OutputStreamWriter wr = new 
     OutputStreamWriter(connection.getOutputStream()); 
     wr.write(jObjectString); 
     wr.close(); 
     ... 
    } 

Ich möchte den obigen Code in Retrofit upload ändern. Nach dem Studium Retrofit Upload Example, die OkHttp RequestBody oder MultipartBody.Part Klassen verwendet. Aber ich habe keine Ahnung, wie ich den obigen Code konvertieren soll.

Irgendwelche Vorschläge?

+0

Ihre Anfrage ist 'JSON' also multipart ist nicht erforderlich – R2R

Antwort

0

1.Erstellen Schnittstelle mit Anfragen und fügen Methode

public interface PostRequests { 

     @PUT("your_url") 
     Call<YourResponse> upload(@Body YourRequest yourRequest); 

    } 

2.Create pojo für Anforderungs- Körper

public class YourRequest { 

    @SerializedName("file_name") 
    @Expose 
    private String fileName; 

    @SerializedName("content_base64") 
    @Expose 
    private String picture; 

    public String getFileName() { 
     return fileName; 
    } 

    public void setFileName(String fileName) { 
     this.fileName = fileName; 
    } 

    public String getPicture() { 
     return picture; 
    } 

    public void setPicture(String picture) { 
     this.picture = picture; 
    } 
} 

3.Init

public class Api { 

private PostRequests mPostRequests; 

public Api() { 
mPostRequests = new Retrofit.Builder() 
     .addConverterFactory(GsonConverterFactory.create()) 
     .baseUrl("your_base_url") 
     .build() 
     .create(PostRequests.class); 
} 

public Call<YourResponse> upload(String localPath) { 
    Bitmap bmp = null; 
    try { 
     bmp = BitmapFactory.decodeFile(localPath); 
     ByteArrayOutputStream outputStream = new  ByteArrayOutputStream(); 
    bmp.compress(Bitmap.CompressFormat.JPEG, 80, outputStream); 
    byte[] byteArrayImage = outputStream.toByteArray(); 
    String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT); 
    YourRequest yourRequest = new YourRequest(); 
    yourRequest.setFileName("test.jpg"); 
    yourRequest.setPicture(encodedImage); 
    return mPostRequests.upload(yourRequest); 
}finally { 
    if(bmp!=null) 
     bmp.recycle(); 
    } 
} 

} 

4.Führen

public void uploadMethod() 
{ 
Api api=new Api(); 
api.upload("path").execute().body();// it is sync operation you can use eneque() for async 
} 

Sie laden Bild in String fromat (Base64), so dass Sie diese Zeichenfolge in Pojo-Objekt einfügen können.

+0

Vielen Dank. Ich hab es geschafft. Sie müssen es als Update-Objekt für den Server behandeln, anstatt es hochzuladen. –

+0

Darf ich noch eine Frage haben. Wenn die Datei auch nach dem Komprimieren zu groß ist und Bildinhalt codierte Zeichenfolge verwendet, kann es das Problem haben? –

+0

@rodent_la hängt von den Servereinstellungen ab. –

Verwandte Themen