Retrofit2 – Wie auf Bild hochladen mit Nachrüstung multipart?

Ich versuche ein Bild hochladen auf dem server mit retrofit2 beta 3. In Antwort ich bin immer Erfolg, aber Bild ist nicht immer hochgeladen auf den server. Ich weiß nicht wo mache ich Fehler.
und

Header-Typ ist Content-Type: application/x-www-form-urlencoded

Mein Interface

@Multipart
@POST("/uploadFile")
Call<ResponseBody> upload(@PartMap Map<String, RequestBody> params);

und die Methode, die ich verwendet für das hochladen ist

Methode für das hochladen von Bildern und Daten

 private void uploadFile() {

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Constants.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
   ApiInterface service =
            retrofit.create(ApiInterface.class);

    File file = new File(fileUri.getPath());
    Log.e(TAG, "uploadFile: " + file.toString());
    String fileName = "uploadFile\"; filename=\"" + file.getName();
    final RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
    final RequestBody empsno = RequestBody.create(MediaType.parse("text/plain"), strEmpsno);
    final RequestBody storsno = RequestBody.create(MediaType.parse("text/plain"), strStoreSno);
    final RequestBody strlr = RequestBody.create(MediaType.parse("text/plain"), strLrno);
    final RequestBody strtecq = RequestBody.create(MediaType.parse("text/plain"), strRecqty);
    final RequestBody strtecv = RequestBody.create(MediaType.parse("text/plain"), strRecvol);
    final RequestBody strtecw = RequestBody.create(MediaType.parse("text/plain"), strRecwgt);
    final RequestBody strdmg = RequestBody.create(MediaType.parse("text/plain"), strDamageqty);
    final RequestBody strlus = RequestBody.create(MediaType.parse("text/plain"), strLooseqty);
    final RequestBody strdd = RequestBody.create(MediaType.parse("text/plain"), strDeliverydate);
    final RequestBody strdt = RequestBody.create(MediaType.parse("text/plain"), strDeliverytime);
    final RequestBody strrem = RequestBody.create(MediaType.parse("text/plain"), strRemarks);
    final RequestBody strrec = RequestBody.create(MediaType.parse("text/plain"), strReceivedby);
    final RequestBody strip = RequestBody.create(MediaType.parse("text/plain"), strIpaddress);

    Map<String, RequestBody> oJSONObject = new HashMap<>();

    oJSONObject.put("empsno", empsno);
    oJSONObject.put("storesno", storsno);
    oJSONObject.put("lrSno", strlr);
    oJSONObject.put("recQty", strtecq);
    oJSONObject.put("recVol", strtecv);
    oJSONObject.put("recWgt", strtecw);
    oJSONObject.put("damageQty", strdmg);
    oJSONObject.put("looseQty", strlus);
    oJSONObject.put("deliveryDate", strdd);
    oJSONObject.put("deliveryTime", strdt);
    oJSONObject.put("remarks", strrem);
    oJSONObject.put("receivedBy", strrec);
    oJSONObject.put("ipAddress", strip);

    Call<ResponseBody> call = service.upload(oJSONObject);
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            Log.e(TAG, "onResponse: " + response.isSuccessful());
            if (response.isSuccessful()) {
                Log.e(TAG, "onResponse: " + response.body());
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.e(TAG, "onFailure: " + t.getLocalizedMessage());
        }
    });

}

Antwort Antwort.isSuccessful()=true. Meine Antwort ist immer erfolgreich wo ist dann mein problem. Bitte helfen Sie mir, um die Lösung zu finden.

Anderen Weg habe ich auch versucht, aber nicht immer den Erfolg, dasselbe Ergebnis auf andere Weise auch

@Multipart
@POST("/uploadFile")
Call<Response> getDetails(@Part("empsno") RequestBody empsno,
                                @Part("storesno")RequestBody  storesno,
                                @Part("lrSno")RequestBody  lrSno,
                                @Part("recQty")RequestBody  recQty,
                                @Part("recVol")RequestBody  recVol,
                                @Part("recWgt")RequestBody  recWgt,
                                @Part("damageQty")RequestBody  damageQty,
                                @Part("looseQty")RequestBody  looseQty,
                                @Part("deliveryDate")RequestBody  deliveryDate,
                                @Part("deliveryTime")RequestBody  deliveryTime,
                                @Part("uploadFile\"; filename=\"abc.jpg\" ") RequestBody part,
                                @Part("remarks")RequestBody  remarks,
                                @Part("receivedBy")RequestBody  receivedBy,
                                @Part("ipAddress") RequestBody ipAddress

und die Methode, die ich verwendet, hier ist

File file = new File(fileUri.getPath());
        RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        MultipartBody.Part body = MultipartBody.Part.createFormData("uploadFile", file.getName(), requestFile);
        RequestBody empsno = RequestBody.create(MediaType.parse("text/plain"), strEmpsno);
        RequestBody storsno = RequestBody.create(MediaType.parse("text/plain"), strStoreSno);
        RequestBody strlr = RequestBody.create(MediaType.parse("text/plain"), strLrno);
        RequestBody strtecq = RequestBody.create(MediaType.parse("text/plain"), strRecqty);
        RequestBody strtecv = RequestBody.create(MediaType.parse("text/plain"), strRecvol);
        RequestBody strtecw = RequestBody.create(MediaType.parse("text/plain"), strRecwgt);
        RequestBody strdmg = RequestBody.create(MediaType.parse("text/plain"), strDamageqty);
        RequestBody strlus = RequestBody.create(MediaType.parse("text/plain"), strLooseqty);
        RequestBody strdd = RequestBody.create(MediaType.parse("text/plain"), strDeliverydate);
        RequestBody strdt = RequestBody.create(MediaType.parse("text/plain"), strDeliverytime);
        RequestBody strrem = RequestBody.create(MediaType.parse("text/plain"), strRemarks);
        RequestBody strrec = RequestBody.create(MediaType.parse("text/plain"), strReceivedby);
        RequestBody strip = RequestBody.create(MediaType.parse("text/plain"), strIpaddress);


        ApixInterface xInterface = retrofit.create(AudexInterface.class);
        Call<Response> podResponsecall = xInterface.getDetails(empsno, storsno, strlr, strtecq,
                strtecv, strtecw, strdmg, strlus, strdd, strdt,
                requestFile, strrem, strrec, strip);


        podResponsecall.enqueue(new Callback<Response>() {
            @Override
            public void onResponse(Call<Response> call, Response<Response> response) {
                Log.e(TAG, "onResponse: " + response.isSuccessful());
                if (response.isSuccessful()) {
                    Toast.makeText(getApplicationContext(), "Successfully saved!!!", Toast.LENGTH_LONG);
                    Log.e(TAG, "onResponse: " + response.body().getResult());
                    uploadFile();
                }
            }

            @Override
            public void onFailure(Call<Response> call, Throwable t) {
                Log.e(TAG, "onFailure: " + t.getLocalizedMessage());
            }
        });

Durch die Nutzung dieser Methode auch die Antwort erfolgreich ist, aber Bild ist nicht immer hochladen auf dem server.

Vielen Dank im Voraus

InformationsquelleAutor AMAN SINGH | 2016-09-07



3 Replies
  1. 0

    meine Lösung ist, dass:

    erste Schritt.

    @Multipart
    @POST("Work/SendPic.ashx")
    Observable<ImgBean> uploadImg(@Part MultipartBody.Part file);

    zweiten Schritt.

      RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"),file);
                        MultipartBody.Part body =
                                MultipartBody.Part.createFormData("img", file.getName(), requestBody);
    
                        UploadImg uploadImg = BaseRetrofit.getInstance().create(UploadImg.class);

    und dann ist es arbeiten.

    • was ist mit anderen details , die zusammen mit dem Bild?
  2. 0

    Was ich beobachtet habe ist, dass es einige Fehler in Okhttp, die nicht Bild hochladen. Behandeln Sie es wie folgt:

    @Multipart
    @POST("api/chats/upload_chat_image")
    Call<UploadChatItemResponse> getImageLink(
            @Header("Authorization") String token,
            @Part("productid") RequestBody productid,
            @Part("touserid") RequestBody touserid,
            @Part("image\";filename=\"image.*\" ") RequestBody image);

    Beachten Sie den letzten Teil. Sie können erstellen @PartMap für die verbleibenden Elemente. Aber tun Sie es nicht für Dateien. Auch das erste Bild im letzten Teil sollte der key-server erwartet beim letzten Bild sollte so sein, wie es ist.

    RequestBody uploadImage = RequestBody.create(MediaType.parse("image/png"), compressed_image);
        RequestBody productId = RequestBody.create(MediaType.parse("text/plain"), product.getProductid() + "");
        RequestBody userId = RequestBody.create(MediaType.parse("text/plain"), otherUserInfo.getUserid() + "");
        Call<UploadChatItemResponse> uploadChatImage = RestClient.getInstance(getApplicationContext()).getRestService()
                .getImageLink(PrefUtils.getToken(ChatActivity.this), productId, userId, uploadImage);
        uploadChatImage.enqueue(new Callback<UploadChatItemResponse>() {
            @Override
            public void onResponse(Call<UploadChatItemResponse> call, Response<UploadChatItemResponse> response) {
                if (response.body() != null && response.body().imageLink != null) {
                    sendMessage(response.body().imageLink, new ChatItem.ChatType(false, ChatItem.ChatType.CHAT_TYPE_IMAGE, ChatItem.ChatType.CHAT_SUBTYPE_NO_SUBTYPE));
                    sweetAlertDialog.dismiss();
                    compressed_image.delete();
                } else {
                    Toast.makeText(ChatActivity.this, "An error has occurred", Toast.LENGTH_SHORT).show();
                    sweetAlertDialog.dismiss();
                    compressed_image.delete();
                }
            }
    
            @Override
            public void onFailure(Call<UploadChatItemResponse> call, Throwable t) {
                Toast.makeText(ChatActivity.this, "An error has occurred", Toast.LENGTH_SHORT).show();
                sweetAlertDialog.dismiss();
                compressed_image.delete();
            }
        });

    Beachte den Typ habe ich beim erstellen RequestBody für Bild.

    Edit:

    Dies ist RestClient.java.

    public class RestClient extends ContextWrapper {
    
    private static final String BASE_URL = "https://www.restapi.in";
    private APIService apiService;
    private static RestClient restClient;
    private static OkHttpClient okHttpClient;
    private static final int READ_TIMEOUT = 100 * 1000;
    private static final int CONNECTION_TIMEOUT = 100 * 1000;
    private static final int CACHE_SIZE = 4;
    private static final String CERTIFICATE_DOMAIN = "www.restclient.in";
    private static final String[] CERTIFICATE_SHA = {"sha256/dkjabkjabcbakjbakjsbcabcahkcbakcbakcbakh=",
                                                     "sha256/ckjdcndkjcnjcnajcnajskcnakjcnakjcnaksjcna=",
                                                     "sha256/cjkacakjcbajcbasjkcbacjcbakcbcbakjbcjkacb="};
    
    private RestClient(Context context) {
        super(context);
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(getOkHttpClient(context))
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        apiService = retrofit.create(APIService.class);
    }
    
    public static RestClient getInstance(Context context){
        if(restClient==null)
            restClient = new RestClient(context.getApplicationContext());
        return restClient;
    }
    
    private static OkHttpClient getOkHttpClient(Context context){
        if (okHttpClient == null) {
            HttpLoggingInterceptor logger = new HttpLoggingInterceptor();
            logger.setLevel(BuildConfig.DEBUG?HttpLoggingInterceptor.Level.HEADERS:HttpLoggingInterceptor.Level.NONE);
            CertificatePinner.Builder certificatePinnerBuilder = new CertificatePinner.Builder();
            for(String sha : CERTIFICATE_SHA)
                certificatePinnerBuilder.add(CERTIFICATE_DOMAIN, sha);
            okHttpClient = new OkHttpClient.Builder()
                    .cache(setCache(context))
                    .certificatePinner(certificatePinnerBuilder.build())
                    .retryOnConnectionFailure(false)
                    .readTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS)
                    .connectTimeout(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)
                    .addInterceptor(new Interceptor() {
                        @Override
                        public okhttp3.Response intercept(Chain chain) throws IOException {
                            Request original = chain.request();
    
                            Request request = original.newBuilder()
                                    .header("Content-type", "application/json")
                                    .header("Accept", "application/json")
                                    .method(original.method(), original.body())
                                    .build();
    
                            return chain.proceed(request);
                        }
                    })
                    .addInterceptor(logger)
                    .build();
        }
        return okHttpClient;
    }
    
    private static Cache setCache(Context context) {
        int cacheSize = CACHE_SIZE * 1024 * 1024;
        return new Cache(new File(context.getCacheDir(), "http"), cacheSize);
    }
    
    public APIService getRestService(){
        return apiService;
    }

    }

    • wie Sie mit Berechtigung hier? seine nicht klar?
    • In meinem Fall wird die Autorisierung erfolgreich, da die ‚Authorization-Header“, wie offensichtlich von der ersten code-snippet, aber Sie können zwicken RestClient.java wie pro Ihre Notwendigkeit.
    • können wir sowohl die annotation(@Teil und @Header) gleichzeitig? ich habe java.lang.IllegalArgumentException: Nur ein encoding-Anmerkung erlaubt ist.
    • Sind Sie mit beiden @Multipart und @FormUrlEncoded Anmerkungen.
    • sorry,mein Fehler.danke für die Klarstellung

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.