চিত্র সহ retrofit 2.0 ব্যবহার করে মাল্টিপার্ট ফর্ম ডেটা পোস্ট করুন


148

আমি retrofit 2.0 ব্যবহার করে সার্ভারে একটি HTTP পোস্ট করার চেষ্টা করছি TP

MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");
MediaType MEDIA_TYPE_IMAGE = MediaType.parse("image/*");

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    imageBitmap.compress(Bitmap.CompressFormat.JPEG,90,byteArrayOutputStream);
profilePictureByte = byteArrayOutputStream.toByteArray();

Call<APIResults> call = ServiceAPI.updateProfile(
        RequestBody.create(MEDIA_TYPE_TEXT, emailString),
        RequestBody.create(MEDIA_TYPE_IMAGE, profilePictureByte));

call.enqueue();

ফাইলটি বৈধ নয় বলে সার্ভার একটি ত্রুটি ফেরায়।

এটি অদ্ভুত কারণ আমি একই ফাইলটি iOS এ একই ফর্ম্যাট দিয়ে আপলোড করার চেষ্টা করেছি (অন্যান্য গ্রন্থাগার ব্যবহার করে) তবে এটি সফলভাবে আপলোড হয়।

আমি ভাবছি রেট্রোফিট ২.০ ব্যবহার করে কোনও চিত্র আপলোড করার সঠিক উপায় কী?

আপলোড করার আগে আমার প্রথমে এটিকে ডিস্কে সংরক্ষণ করা উচিত?

PS: আমি অন্যান্য মাল্টিপার্ট অনুরোধের জন্য পুনঃনির্মাণ ব্যবহার করেছি যা চিত্র অন্তর্ভুক্ত করে না এবং সেগুলি সফলভাবে সম্পন্ন হয়েছে। সমস্যাটি যখন আমি শরীরে একটি বাইট অন্তর্ভুক্ত করার চেষ্টা করছি।



উত্তর:


180

আমি সমাধানটি 1.9 এবং 2.0 উভয় ক্ষেত্রে হাইলাইট করছি কারণ এটি কারও জন্য কার্যকর

ইন 1.9, আমি মনে করি আরও ভাল সমাধান হ'ল ফাইলটি ডিস্কে সংরক্ষণ করা এবং এটি টাইপ করা ফাইলের মতো ব্যবহার করা:

RetroFit 1.9

(আমি আপনার সার্ভার-সাইড বাস্তবায়ন সম্পর্কে জানি না) এর মতো একটি এপিআই ইন্টারফেস পদ্ধতি রয়েছে

@POST("/en/Api/Results/UploadFile")
void UploadFile(@Part("file") TypedFile file,
                @Part("folder") String folder,
                Callback<Response> callback);

এবং এটি ব্যবহার করুন

TypedFile file = new TypedFile("multipart/form-data",
                                       new File(path));

রেট্রোফিট 2 এর জন্য নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন

রেট্রোফিট 2.0 (এটি একটি একটি কার্যসংক্রান্ত ছিল ইস্যু , রেট্রোফিট 2 যা এখন সংশোধন করা হয়েছে সঠিক পদ্ধতির জন্য পড়ুন jimmy0251 এর উত্তর )

এপিআই ইন্টারফেস:

public interface ApiInterface {

    @Multipart
    @POST("/api/Accounts/editaccount")
    Call<User> editUser(@Header("Authorization") String authorization,
                        @Part("file\"; filename=\"pp.png\" ") RequestBody file,
                        @Part("FirstName") RequestBody fname,
                        @Part("Id") RequestBody id);
}

এটি ব্যবহার করুন:

File file = new File(imageUri.getPath());

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

RequestBody name = RequestBody.create(MediaType.parse("text/plain"),
                                      firstNameField.getText()
                                                    .toString());

RequestBody id = RequestBody.create(MediaType.parse("text/plain"),
                                    AZUtils.getUserId(this));

Call<User> call = client.editUser(AZUtils.getToken(this),
                                  fbody,
                                  name,
                                  id);

call.enqueue(new Callback<User>() {

    @Override
    public void onResponse(retrofit.Response<User> response,
                           Retrofit retrofit) {

        AZUtils.printObject(response.body());
    }

    @Override
    public void onFailure(Throwable t) {

        t.printStackTrace();
    }
});

5
হ্যাঁ, ভাল আমি মনে করি এটি একটি সমস্যা ( github.com/square/retrofit/issues/1063 ) retrofit 2.0 সহ, আপনি 1.9 দিয়ে থাকতে চান
অনিদ্রা

2
আমার সম্পাদনা দেখুন, আমি এখনও এটি চেষ্টা করি নি, আপনাকে স্বাগত জানানো হয়
অনিদ্রা

1
আমি সাফল্যের সাথে ডি রিট্রোফিট ২.০ উদাহরণ ব্যবহার করে একটি চিত্র আপলোড করেছি।
jerogaren

3
@ ভরগাভ আপনি ইন্টারফেসটি পরিবর্তন করতে পারেন @Multipart @POST("/api/Accounts/editaccount") Call<User> editUser(@PartMap Map<String, RequestBody> params);এবং যখন আপনার কাছে ফাইলটি রয়েছে: Map<String, RequestBody> map = new HashMap<>(); RequestBody fileBody = RequestBody.create(MediaType.parse("image/jpg"), file); map.put("file\"; filename=\"" + file.getName(), fileBody);
অনিদ্রা

2
@ ইনসমিনিয়াক হ্যাঁ আমি সবেমাত্র এটি সম্পর্কে জানতে পেরেছি, এটিও ব্যবহার করতে পারিMultiPartBody.Part
ভড়গব

177

একটি নেই সঠিক সঙ্গে তার নামের সঙ্গে একটি ফাইল আপলোড প্রণালী রেট্রোফিট 2 , কোনো ছাড়া হ্যাক :

API ইন্টারফেসটি সংজ্ঞায়িত করুন:

@Multipart
@POST("uploadAttachment")
Call<MyResponse> uploadAttachment(@Part MultipartBody.Part filePart); 
                                   // You can add other parameters too

ফাইল আপলোড করুন:

File file = // initialize file here

MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));

Call<MyResponse> call = api.uploadAttachment(filePart);

এটি কেবল ফাইল আপলোডিং দেখায়, আপনি @Partটীকা সহ একই পদ্ধতিতে অন্যান্য পরামিতিগুলি যুক্ত করতে পারেন ।


2
আমরা মাল্টিপার্টবিডি.পার্ট ব্যবহার করে কীভাবে একাধিক ফাইল প্রেরণ করতে পারি?
প্রবীণ শর্মা

আপনি MultipartBody.Partএকই এপিআইতে একাধিক যুক্তি ব্যবহার করতে পারেন ।
jimmy0251

একটি চাবি হিসাবে "চিত্র []" সহ আমাকে চিত্র সংগ্রহ করতে হবে। আমি চেষ্টা করেছি @Part("images[]") List<MultipartBody.Part> imagesকিন্তু এতে ত্রুটিটি পাওয়া যায়@Part parameters using the MultipartBody.Part must not include a part name
প্রবীণ শর্মা

আপনার ব্যবহার করা উচিত @Body MultipartBody multipartBodyএবং MultipartBody.Builderচিত্র সংগ্রহ পাঠানোর জন্য।
jimmy0251

2
আমি কীভাবে মুটিপার্টে কী যুক্ত করতে পারি
andro

23

আমি আমার রেজিস্টার ব্যবহারকারীদের জন্য রেট্রোফিট ২.০ ব্যবহার করেছি, রেজিস্টার অ্যাকাউন্ট থেকে মাল্টিপার্ট / ফর্ম ফাইল চিত্র এবং পাঠ্য প্রেরণ করেছি

আমার রেজিস্টারঅ্যাক্টিভিটিতে একটি অ্যাসিঙ্কটাস্ক ব্যবহার করুন

//AsyncTask
private class Register extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {..}

    @Override
    protected String doInBackground(String... params) {
        new com.tequilasoft.mesasderegalos.dbo.Register().register(txtNombres, selectedImagePath, txtEmail, txtPassword);
        responseMensaje = StaticValues.mensaje ;
        mensajeCodigo = StaticValues.mensajeCodigo;
        return String.valueOf(StaticValues.code);
    }

    @Override
    protected void onPostExecute(String codeResult) {..}

এবং আমার রেজিস্টার.জভা ক্লাসে সিঙ্ক্রোনাস কল সহ retrofit ব্যবহার করুন

import android.util.Log;
import com.tequilasoft.mesasderegalos.interfaces.RegisterService;
import com.tequilasoft.mesasderegalos.utils.StaticValues;
import com.tequilasoft.mesasderegalos.utils.Utilities;
import java.io.File;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call; 
import retrofit2.Response;
/**Created by sam on 2/09/16.*/
public class Register {

public void register(String nombres, String selectedImagePath, String email, String password){

    try {
        // create upload service client
        RegisterService service = ServiceGenerator.createUser(RegisterService.class);

        // add another part within the multipart request
        RequestBody requestEmail =
                RequestBody.create(
                        MediaType.parse("multipart/form-data"), email);
        // add another part within the multipart request
        RequestBody requestPassword =
                RequestBody.create(
                        MediaType.parse("multipart/form-data"), password);
        // add another part within the multipart request
        RequestBody requestNombres =
                RequestBody.create(
                        MediaType.parse("multipart/form-data"), nombres);

        MultipartBody.Part imagenPerfil = null;
        if(selectedImagePath!=null){
            File file = new File(selectedImagePath);
            Log.i("Register","Nombre del archivo "+file.getName());
            // create RequestBody instance from file
            RequestBody requestFile =
                    RequestBody.create(MediaType.parse("multipart/form-data"), file);
            // MultipartBody.Part is used to send also the actual file name
            imagenPerfil = MultipartBody.Part.createFormData("imagenPerfil", file.getName(), requestFile);
        }

        // finally, execute the request
        Call<ResponseBody> call = service.registerUser(imagenPerfil, requestEmail,requestPassword,requestNombres);
        Response<ResponseBody> bodyResponse = call.execute();
        StaticValues.code  = bodyResponse.code();
        StaticValues.mensaje  = bodyResponse.message();
        ResponseBody errorBody = bodyResponse.errorBody();
        StaticValues.mensajeCodigo  = errorBody==null
                ?null
                :Utilities.mensajeCodigoDeLaRespuestaJSON(bodyResponse.errorBody().byteStream());
        Log.i("Register","Code "+StaticValues.code);
        Log.i("Register","mensaje "+StaticValues.mensaje);
        Log.i("Register","mensajeCodigo "+StaticValues.mensaje);
    }
    catch (Exception e){
        e.printStackTrace();
    }
}
}

রেজিস্টারসেবার ইন্টারফেসে

public interface RegisterService {
@Multipart
@POST(StaticValues.REGISTER)
Call<ResponseBody> registerUser(@Part MultipartBody.Part image,
                                @Part("email") RequestBody email,
                                @Part("password") RequestBody password,
                                @Part("nombre") RequestBody nombre
);
}

ইউটিলিটিগুলির ਪਾਰস অফ ইনপুটস্ট্রিম প্রতিক্রিয়াটির জন্য

public class Utilities {
public static String mensajeCodigoDeLaRespuestaJSON(InputStream inputStream){
    String mensajeCodigo = null;
    try {
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(
                    inputStream, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line).append("\n");
        }
        inputStream.close();
        mensajeCodigo = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }
    return mensajeCodigo;
}
}

16

Retrofit2.0 এ চিত্র ফাইল আপলোড করার জন্য কোড আপডেট করুন

public interface ApiInterface {

    @Multipart
    @POST("user/signup")
    Call<UserModelResponse> updateProfilePhotoProcess(@Part("email") RequestBody email,
                                                      @Part("password") RequestBody password,
                                                      @Part("profile_pic\"; filename=\"pp.png")
                                                              RequestBody file);
}

পরিবর্তন MediaType.parse("image/*")করুনMediaType.parse("image/jpeg")

RequestBody reqFile = RequestBody.create(MediaType.parse("image/jpeg"),
                                         file);
RequestBody email = RequestBody.create(MediaType.parse("text/plain"),
                                       "upload_test4@gmail.com");
RequestBody password = RequestBody.create(MediaType.parse("text/plain"),
                                          "123456789");

Call<UserModelResponse> call = apiService.updateProfilePhotoProcess(email,
                                                                    password,
                                                                    reqFile);
call.enqueue(new Callback<UserModelResponse>() {

    @Override
    public void onResponse(Call<UserModelResponse> call,
                           Response<UserModelResponse> response) {

        String
                TAG =
                response.body()
                        .toString();

        UserModelResponse userModelResponse = response.body();
        UserModel userModel = userModelResponse.getUserModel();

        Log.d("MainActivity",
              "user image = " + userModel.getProfilePic());

    }

    @Override
    public void onFailure(Call<UserModelResponse> call,
                          Throwable t) {

        Toast.makeText(MainActivity.this,
                       "" + TAG,
                       Toast.LENGTH_LONG)
             .show();

    }
});

আমি এটি করার জন্য অনেক উপায়ে চেষ্টা করেছিলাম তবে ফলাফল পেতে পারি না। আপনি যেমনটি বলেছিলেন ঠিক তেমনই আমি এই ("মিডিয়াটাইপ.পার্স (" চিত্র / * ") পরিবর্তন করে মিডিয়াটাইপ.পার্স (" চিত্র / জেপিগ ")" তে পরিবর্তন করেছি এবং এটি এখন কাজ করে, আপনাকে অনেক ধন্যবাদ।
গুনার

আমি আপনাকে একাধিক ভোট দিতে পারতাম, ধন্যবাদ
রোহিত মৌর্য

যদি আপনার এপিআইতে টীকা থাকে @Multipartতবে @Partঅবশ্যই একটি নাম সরবরাহ করতে হবে বা মাল্টিপার্টবডি. পার্ট প্যারামিটার প্রকারটি ব্যবহার করতে হবে।
রোহিত

ভাল সমাধান! এবং @ পার্টে আরও একটি উক্তি রয়েছে ("প্রোফাইল_পিক \"; ফাইলের নাম = \ "পিপি.পিএনজি \" ", এটি শোনাবে@Part("profile_pic\"; filename=\"pp.png "
নিনজা

15

@ ইনসমনিয়াকের দেওয়া উত্তরে যুক্ত করা হচ্ছে । আপনি চিত্র সহ Mapপ্যারামিটার রাখতে একটি তৈরি করতে পারেন RequestBody

ইন্টারফেসের জন্য কোড

public interface ApiInterface {
@Multipart
@POST("/api/Accounts/editaccount")
Call<User> editUser (@Header("Authorization") String authorization, @PartMap Map<String, RequestBody> map);
}

জাভা ক্লাসের জন্য কোড

File file = new File(imageUri.getPath());
RequestBody fbody = RequestBody.create(MediaType.parse("image/*"), file);
RequestBody name = RequestBody.create(MediaType.parse("text/plain"), firstNameField.getText().toString());
RequestBody id = RequestBody.create(MediaType.parse("text/plain"), AZUtils.getUserId(this));

Map<String, RequestBody> map = new HashMap<>();
map.put("file\"; filename=\"pp.png\" ", fbody);
map.put("FirstName", name);
map.put("Id", id);
Call<User> call = client.editUser(AZUtils.getToken(this), map);
call.enqueue(new Callback<User>() {
@Override
public void onResponse(retrofit.Response<User> response, Retrofit retrofit) 
{
    AZUtils.printObject(response.body());
}

@Override
public void onFailure(Throwable t) {
    t.printStackTrace();
 }
});

আমি কীভাবে 2 টি স্ট্রিং সহ একাধিক ফাইল আপলোড করতে পারি?
জে ডাঙ্গার

আপনার পক্ষে কি উত্তর দেওয়া সম্ভব stackoverflow.com/questions/60428238/…
রঞ্জিত

14

সুতরাং এটি আপনার কাজ অর্জন করার খুব সহজ উপায়। আপনাকে নীচের পদক্ষেপটি অনুসরণ করতে হবে: -

1. প্রথম পদক্ষেপ

public interface APIService {  
    @Multipart
    @POST("upload")
    Call<ResponseBody> upload(
        @Part("item") RequestBody description,
        @Part("imageNumber") RequestBody description,
        @Part MultipartBody.Part imageFile
    );
}

আপনার পুরো কলটি যেমন করা দরকার তেমন @Multipart requestitemএবং image numberকেবল স্ট্রিং বডি যা এতে মোড়ানো RequestBody। আমরা এটি ব্যবহার করি MultipartBody.Part classযা অনুরোধের সাথে বাইনারি ফাইল ডেটা ছাড়াও আসল ফাইলের নামটি আমাদের প্রেরণ করতে দেয়

2. দ্বিতীয় পদক্ষেপ

  File file = (File) params[0];
  RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);

  MultipartBody.Part body =MultipartBody.Part.createFormData("Image", file.getName(), requestBody);

  RequestBody ItemId = RequestBody.create(okhttp3.MultipartBody.FORM, "22");
  RequestBody ImageNumber = RequestBody.create(okhttp3.MultipartBody.FORM,"1");
  final Call<UploadImageResponse> request = apiService.uploadItemImage(body, ItemId,ImageNumber);

এখন আপনার আছে image pathএবং আপনার fileএখন । পদ্ধতিতে রূপান্তর করতে fileহবে । এখন আপনার নিজের ব্যবহার পদ্ধতিতে রূপান্তর করতে হবে ।RequestBodyRequestBody.create(MediaType.parse("multipart/form-data"), file)RequestBody requestFileMultipartBody.PartMultipartBody.Part.createFormData("Image", file.getName(), requestBody);

ImageNumberএবং ItemIdআমার অন্য ডেটা যা আমার সার্ভারে প্রেরণ করা দরকার তাই আমি উভয় জিনিসই তৈরি করে ফেলছি RequestBody

আরও তথ্যের জন্য


3

রেট্রোফিট ব্যবহার করে ফাইলগুলি আপলোড করা বেশ সহজ You আপনাকে আপনার এপিআই ইন্টারফেস হিসাবে তৈরি করতে হবে

public interface Api {

    String BASE_URL = "http://192.168.43.124/ImageUploadApi/";


    @Multipart
    @POST("yourapipath")
    Call<MyResponse> uploadImage(@Part("image\"; filename=\"myfile.jpg\" ") RequestBody file, @Part("desc") RequestBody desc);

}

উপরের কোড চিত্রটিতে মূল নাম তাই আপনি যদি পিএইচপি ব্যবহার করেন তবে আপনি এটি পেতে $ _FILES ['চিত্র'] ['tmp_name'] লিখবেন । এবং ফাইলের নাম = "myfile.jpg" আপনার ফাইলটির নাম যা অনুরোধের সাথে প্রেরণ করা হচ্ছে।

এখন ফাইল আপলোড করতে আপনার এমন একটি পদ্ধতি দরকার যা আপনাকে উড়ি থেকে পরম পথ দেবে।

private String getRealPathFromURI(Uri contentUri) {
    String[] proj = {MediaStore.Images.Media.DATA};
    CursorLoader loader = new CursorLoader(this, contentUri, proj, null, null, null);
    Cursor cursor = loader.loadInBackground();
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String result = cursor.getString(column_index);
    cursor.close();
    return result;
}

এখন আপনি নিজের ফাইল আপলোড করতে নীচের কোডটি ব্যবহার করতে পারেন।

 private void uploadFile(Uri fileUri, String desc) {

        //creating a file
        File file = new File(getRealPathFromURI(fileUri));

        //creating request body for file
        RequestBody requestFile = RequestBody.create(MediaType.parse(getContentResolver().getType(fileUri)), file);
        RequestBody descBody = RequestBody.create(MediaType.parse("text/plain"), desc);

        //The gson builder
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();


        //creating retrofit object
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Api.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

        //creating our api 
        Api api = retrofit.create(Api.class);

        //creating a call and calling the upload image method 
        Call<MyResponse> call = api.uploadImage(requestFile, descBody);

        //finally performing the call 
        call.enqueue(new Callback<MyResponse>() {
            @Override
            public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {
                if (!response.body().error) {
                    Toast.makeText(getApplicationContext(), "File Uploaded Successfully...", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getApplicationContext(), "Some error occurred...", Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void onFailure(Call<MyResponse> call, Throwable t) {
                Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
            }
        });
    }

আরও বিশদ ব্যাখ্যার জন্য আপনি এই retrofit আপলোড ফাইল টিউটোরিয়ালটি দেখতে পারেন


এটি একটি হ্যাক, এটি কিছুক্ষণের জন্য retrofit 2.0 এ ঠিক করা হয়েছে। নীচে jimmy0251 উত্তর দেখুন।
ম্যাট ওল্ফ

1

বর্ণনার জন্য আপডেটের সাথে কোটলিন সংস্করণ RequestBody.create:

Retrofit ইন্টারফেস

@Multipart
@POST("uploadPhoto")
fun uploadFile(@Part file: MultipartBody.Part): Call<FileResponse>

এবং আপলোড করতে

fun uploadFile(fileUrl: String){
    val file = File(fileUrl)
    val fileUploadService = RetrofitClientInstance.retrofitInstance.create(FileUploadService::class.java)
    val requestBody = file.asRequestBody(file.extension.toMediaTypeOrNull())
    val filePart = MultipartBody.Part.createFormData(
        "blob",file.name,requestBody
    )
    val call = fileUploadService.uploadFile(filePart)

    call.enqueue(object: Callback<FileResponse>{
        override fun onFailure(call: Call<FileResponse>, t: Throwable) {
            Log.d(TAG,"Fckd")
        }

        override fun onResponse(call: Call<FileResponse>, response: Response<FileResponse>) {
            Log.d(TAG,"success"+response.toString()+" "+response.body().toString()+"  "+response.body()?.status)
        }

    })
}

@ Jimmy0251 ধন্যবাদ


0

ফাংশনের নামে একাধিক পরামিতি ব্যবহার করবেন না কেবল কোডগুলির পাঠযোগ্যতা বাড়ানোর জন্য সাধারণ কয়েকটি আরগস কনভেনশন নিয়ে যান - এর জন্য আপনি পছন্দ করতে পারেন -

// MultipartBody.Part.createFormData("partName", data)
Call<SomReponse> methodName(@Part MultiPartBody.Part part);
// RequestBody.create(MediaType.get("text/plain"), data)
Call<SomReponse> methodName(@Part(value = "partName") RequestBody part); 
/* for single use or you can use by Part name with Request body */

// add multiple list of part as abstraction |ease of readability|
Call<SomReponse> methodName(@Part List<MultiPartBody.Part> parts); 
Call<SomReponse> methodName(@PartMap Map<String, RequestBody> parts);
// this way you will save the abstraction of multiple parts.

থাকতে পারে একাধিক ব্যতিক্রম রেট্রোফিট, ব্যতিক্রম কোড হিসেবে নথিভুক্ত সব ব্যবহার করার সময় আপনি সম্মুখীন হতে পারে , একটি, walkthrough আছেretrofit2/RequestFactory.java । আপনি দুটি ফাংশন সক্ষম করতে পারেন parseParameterAnnotationএবং parseMethodAnnotationযেখানে আপনি ফেলে দেওয়া ব্যতিক্রম করতে সক্ষম করতে পারেন, দয়া করে এটির মাধ্যমে যান, এটি গুগলিং / স্ট্যাকওভারফ্লোয়ের চেয়ে আপনার অনেক সময় সাশ্রয় করবে


0

কোটলিনে এটি মিডিয়াটাইপ , asRequestBody এবং toRequestBody এর এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে এটি বেশ সহজ an

এখানে আমি একটি পিডিএফ ফাইল এবং মাল্টিপার্ট ব্যবহার করে একটি চিত্র ফাইলের সাথে বেশ কয়েকটি সাধারণ ক্ষেত্র পোস্ট করছি

এটি retrofit ব্যবহার করে এপিআই ঘোষণা:

    @Multipart
    @POST("api/Lesson/AddNewLesson")
    fun createLesson(
        @Part("userId") userId: RequestBody,
        @Part("LessonTitle") lessonTitle: RequestBody,
        @Part pdf: MultipartBody.Part,
        @Part imageFile: MultipartBody.Part
    ): Maybe<BaseResponse<String>>

এবং প্রকৃতপক্ষে এটি কীভাবে কল করা যায় তা এখানে:

api.createLesson(
            userId.toRequestBody("text/plain".toMediaType()),
            lessonTitle.toRequestBody("text/plain".toMediaType()),
            startFromRegister.toString().toRequestBody("text/plain".toMediaType()),
            MultipartBody.Part.createFormData(
                "jpeg",
                imageFile.name,
                imageFile.asRequestBody("image/*".toMediaType())
            ),
            MultipartBody.Part.createFormData(
                "pdf",
                pdfFile.name,
                pdfFile.asRequestBody("application/pdf".toMediaType())
            )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.