दिलचस्प पोस्ट
ASP.NET web.config: configSource बनाम फ़ाइल विशेषताएँ कोणीय में वादा करने के लिए एक टाइमआउट हैन्डलर सेट करना मैं गतिशील रूप से जावास्क्रिप्ट का उपयोग कर एक लिंक पर "href" विशेषता कैसे जोड़ सकता हूं? कैसे एक एसआईएम () द्वारा MySQL में आदेश? क्या पॉवरहेल स्क्रिप्ट को डबल क्लिक करके .ps1 फ़ाइल पर काम करने का कोई तरीका है? MySQL के साथ औसत गणना करने का आसान तरीका PHP में सुरक्षित उपयोगकर्ता छवि अपलोड क्षमताओं समतल / अन-फ्लैटेन नेस्टेड जेएसएएन ऑब्जेक्ट्स को फ्लैटन करने का सबसे तेज़ तरीका एंड्रॉइड स्थान प्रबंधक, जीपीएस स्थान प्राप्त करें, यदि कोई जीपीएस नहीं तो नेटवर्क प्रदाता स्थान पर पहुंचें एंड्रॉइड में एंड्रॉइड (एंड्रॉइड में मोबाइल के लिए मल्टी स्क्रीन) किसी भी स्क्रीन साइज और डिज़ाइन कैसे करें सी / सी + + जांच अगर एक बिट सेट है, अर्थात चर चर Ggplot2 के साथ एक मंडल बनाएं एक्सएमएल में अन्य कॉन्फ़िग फाइल्स की सेटिंग्स को शामिल करने के लिए app.config में शामिल हैं या कॉन्फ़िगर संदर्भ आईओएस एप्स में डेटा के साथ काम करना (क्या चुनना है? एनएसडीटा, कोरडेटा, एसक्लाइट, प्लिस्ट, एनएसयूएसर डेफल्स) नाम के साथ FirebaseApp मौजूद नहीं है

पोस्ट सहित रेट्रोफ़िट 2.0 का उपयोग कर मल्टीपार्ट फॉर्म डेटा पोस्ट करें

मैं रिट्रोफाइट 2.0 का उपयोग कर एक HTTP पोस्ट को सर्वर पर करने की कोशिश कर रहा हूं

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(); 

सर्वर त्रुटि कहता है कि फ़ाइल मान्य नहीं है।

यह अजीब है क्योंकि मैंने उसी फ़ाइल को आईओएस (अन्य लाइब्रेरी के उपयोग से) पर एक ही प्रारूप में अपलोड करने की कोशिश की है, लेकिन यह सफलतापूर्वक अपलोड करता है।

मैं सोच रहा हूं कि रेट्रोफाइट 2.0 का उपयोग कर छवि अपलोड करने का सही तरीका क्या है?

क्या मुझे इसे अपलोड करने से पहले डिस्क पर सहेजना चाहिए?

धन्यवाद!

पुनश्च: मैंने अन्य बहुपक्षीय अनुरोध के लिए रेट्रोफ़िट का उपयोग किया है जिसमें छवि शामिल नहीं है और उन्होंने सफलतापूर्वक पूर्ण किया है समस्या तब होती है जब मैं शरीर को एक बाइट को शामिल करने की कोशिश कर रहा हूं।

Solutions Collecting From Web of "पोस्ट सहित रेट्रोफ़िट 2.0 का उपयोग कर मल्टीपार्ट फॉर्म डेटा पोस्ट करें"

मैं समाधान 1.9 और 2.0 दोनों में उजागर कर रहा हूं क्योंकि यह कुछ के लिए उपयोगी है I

1.9 , मुझे लगता है कि फाइल को डिस्क पर सहेजने के लिए बेहतर समाधान है और इसे टाइप की गई फ़ाइल के रूप में उपयोग करें:

रेट्रोफ़िट 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

एपीआई इंटरफ़ेस:

 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(); } }); 

किसी भी हैक के बिना, अपने नाम के साथ फ़ाइल अपलोड करने का एक सही तरीका है, रेट्रोफ़िट 2 के साथ:

एपीआई इंटरफ़ेस परिभाषित करें:

 @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.0 का इस्तेमाल किया, मल्टीपार्ट / फॉर्म फ़ाइल इमेज और टेक्स्ट अकाउंट से पाठ भेज दिया

मेरी रजिस्टर सक्रियण में, एक एसिंक टास्क का उपयोग करें

 //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) {..} 

और मेरे रजिस्टर.जावा वर्ग में है जहां तुल्यकालिक कॉल के साथ रेट्रोफ़िट का इस्तेमाल होता है

 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; } } 

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/*") 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(); } }); 

@ इंडोमनीक द्वारा दिए गए उत्तर में जोड़ना आप चित्र सहित RequestBody लिए पैरामीटर डाल करने के लिए Map बना सकते हैं।

इंटरफ़ेस के लिए कोड

 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(); } }); 

रेट्रोफ़िट का उपयोग कर फाइल अपलोड करना काफी आसान है आपको अपना एपीआई इंटरफ़ेस बनाने की आवश्यकता है

 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); } 

उपरोक्त कोड छवि में कुंजी नाम है, इसलिए यदि आप PHP का उपयोग कर रहे हैं तो आप इसे प्राप्त करने के लिए $ $ _FILES ['image'] ['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(); } }); } 

अधिक विस्तृत व्याख्या के लिए आप इस रेट्रोफ़िट अपलोड फ़ाइल ट्यूटोरियल पर जा सकते हैं