2016-07-01 24 views
-2

Ich brauche eine Datei laden zusammen mit einem JSON Object von Strings mit form-data POST, um mit meiner Schnittstelle unten gezeigt:Erstellen einer Multipart HTTP POST-Anforderung mit @PartMap oder einem mehrteiligen entspricht @FieldMap

public interface uploadService { 
    @Multipart 
    @POST 
    Call<Void> uploadPhoto(@Part("photo") File file, 
      @PartMap Map<String, Object> params); 
} 

I‘ m mit dem Fehler End of Line 1 at Column 1, geht meine Callback auf die OnError(...) Methode. Kurz gesagt ist meine HTTP-Anfrage nicht erfolgreich. Ich habe mich gefragt, wo ich falsch gelaufen bin.

Antworten werden sehr geschätzt.

PS: Bitte schlagen Sie nicht vor, mich zu verwenden MultipartEntity extends HttpEntity Ich habe gelesen, dass dies jetzt veraltet ist. Vielen Dank!

+0

Teilen Sie Ihre Log-Katze – SaravInfern

Antwort

2

Nach für mich arbeitet

Schnittstelle

@Multipart 
@POST("user/upload") 
Call<JsonElement> upload(@PartMap Map<String, RequestBody> params);, user.getToken()); 

Daten und Bild senden als

folgt
LinkedHashMap<String, RequestBody> mp= new LinkedHashMap<>(); 
RequestBody userId = RequestBody.create(
         okhttp3.MediaType.parse("text/plain"), user.getUserId()); 
RequestBody userToken = RequestBody.create(
         okhttp3.MediaType.parse("text/plain"), user.getToken()); 

//Instead of "text/plain" you can also send Json 
mp.put("user_id", userId); 
mp.put("token", userToken); 


avatarFile = new File(uri.getPath()); 

RequestBody fileBody = RequestBody.create(MediaType.parse("image/gif"), avatarFile); 

mp.put("files\"; filename=\"image.gif\"", fileBody); 
+0

Vielen Dank auch für die Beantwortung meiner Fragen @penguin! Ich werde deine Antwort morgen auch testen und ich werde dich und NIPHIN wie es sich herausstellte, lassen! :) –

1

PartMap allein könnte für mehrteilige ausreichen. partmap Verwendung

@Multipart 
    @POST("api/registration") 
    Call<UserDetails> registerUser (@Header("Content-Length") long contentLength, @PartMap Map<String, RequestBody> params); 

Sie eine Requestody erstellen Datei wie

RequestBody.create(MediaType.parse("image/*"), file); 

und fügen Sie es zu halten.

Map<String, RequestBody> params; // Erstellen und fügen Sie alle Arten von Anfragen zu dieser Karte hinzu. könnten Sie die Inhaltslänge berechnen, indem

long contentLength = 0; 
     Iterator iterator = params.entrySet().iterator(); 
     while (iterator.hasNext()){ 
      Map.Entry pair = (Map.Entry)iterator.next(); 
      try { 
       contentLength = contentLength + ((RequestBody)pair.getValue()).contentLength(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

. Wenn Sie den Fortschritt des Datei-Uploads verfolgen möchten, können Sie das RequestBody erweitern, um Informationen über den Fortschritt zu erhalten.

public class ProgressRequestBody extends RequestBody { 

private File file; 
private ProgressListener listener; 
private int DEFAULT_BUFFER_SIZE = 4084; 

@Override 
public MediaType contentType() { 
    return MediaType.parse("image/*"); 
} 

//The constructor 
public ProgressRequestBody(final File file, final ProgressListener listener) { 
    this.file = file; 
    this.listener = listener; 
} 

//The method to overide 
@Override 
public void writeTo(BufferedSink sink) throws IOException { 
    long fileLength = file.length(); 
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 
    FileInputStream in = new FileInputStream(file); 
    long total = 0; 
    try { 
     int read; 
     while ((read = in.read(buffer)) != -1) { 
      this.listener.onProgress(total, fileLength); 
      total += read; 
      sink.write(buffer, 0, read); 
     } 
    } finally { 
     in.close(); 
    } 
} 

//A simple callback 
public interface ProgressListener { 
    void onProgress(final long current, final long max); 
} 

}

und es verwenden, um die Datei wie

public static RequestBody toImageRequestBody(File file, ProgressListener progressListener) { 
     ProgressRequestBody progressRequestBody = new ProgressRequestBody(file, progressListener); 
     return progressRequestBody; 
    } 

Halten Sie es als Bonus zu wickeln;)

+0

Dank NIPHIN! Ich werde diese Antwort morgen testen! :) –