استفاده از Retrofit برای تبادل اطلاعات با سرور روز به روز گسترش پیدا میکنه. سرعت و سهولت استفاده، از ویژگیهای خوب این کتابخانه هست. تقریبا ۲۰ روزی هست که مشکل ارسال فایل با نام متغیر در این کتابخانه حل شده، خواستم که در اینجا آموزش این کار رو قرار بدم.
ابتدا خطوط زیر رو به build.gradle اضافه کنید. دقت کنید که این امکانات در همین ورژن ارائه شدهاست:
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2' compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
بزارید که gradle کار sync کردن کتابخانهها رو انجام بده.
کلاس interface به نام RetrofitService ایجاد کنید:
import com.squareup.okhttp.RequestBody; import java.util.Map; import retrofit.Call; import retrofit.http.Multipart; import retrofit.http.POST; import retrofit.http.PartMap; public interface RetrofitService { @Multipart @POST("uploadImage.php") Call<String> uploadImage(@PartMap() Map<String, RequestBody> mapFileAndName); }
در این کلاس تابع uploadImage تعریف شده که اطلاعات رو به لینک uploadImage.php به صورت POST ارسال میکنه.
روش فراخوانی این تابع بدین صورت هست:
public void upload(String path,String fileName) { path+=fileName; final File file = new File(path); Retrofit retrofit = new Retrofit.Builder().baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .build(); RetrofitService retrofitService=retrofit.create(RetrofitService.class); RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file); HashMap<String,RequestBody> map=new HashMap<>(); map.put("file\"; filename=\""+fileName+"",requestBody); Call<String> call = retrofitService.uploadImage(map); call.enqueue(new Callback<String>() { @Override public void onResponse(Response<String> response, Retrofit retrofit) { if(response!=null){ Log.i("upload","is success:" +response.body()); }else{ Log.i("upload","response is null"); } } @Override public void onFailure(Throwable t) { Log.i("upload","onFailure: "+t.getMessage()); } }); }
مقدار آدرس سرور که به عنوان baseUrl به Retrofit ارسال میشه (برای مثال) به صورت زیر تعریف میشه:
private String url="https://startups.ir/";
تابع upload تعریف شده دو مقدار دریافت میکنه، یکی میسر فایل و دیگری نام فایل مورد نظر برای آپلود. نکتهای که در مورد ارسال فایل در Retrofit وجود داره اینه که حتما باید نام فایل به همراه فایل ارسال بشه. در روش ذکر شده با استفاده از HashMap میتونید چندین فایل رو برای آپلود ارسال کنید.
فراخوانی تابع upload به صورت زیر است:
String path = Environment.getExternalStorageDirectory().toString()+"/";//root of external storage String fileName="Image2015.jpg"; upload(path,fileName);
در آخر کد مروبط به بخش دریافتکننده فایل که با زبان php نوشته شده رو ببینید (دقت کنید که این کد به سادهترین صورت ممکن نوشته شده):
<?php $file_path = "uploadImages/"; $file_path = $file_path . basename( $_FILES['file']['name']); $status=""; if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path)) { $status="true"; } else{ $status="false"; } echo json_encode($status); ?>
فایل ارسال شده در پوشه uploadImages قرار میگیره.
معرکه اید
ممنونم
بسیار عالی، شما از محدود سایت های فعال در زمینه تولید محتوا هستید و بسیار معرکه اید.
سلام و یه خسته نباشید جانانه برای زحمات بسیار بسیار با ارزشتون
خیلی آموزش هاتون عالیه فقط یه موردی رو اگه رعایت کنید ممنون خیلی عالی میشه
اونم اینه که محل کد هارو مشخص کنید. مثلا بگید توی MainActivity.java فلان رو وارد می کنید.
که ساختار مشخص تر و واضح تر بشه. مخصوصا برای افراد مبتدی چون من.
در کل امیدوارم همچنان با قدرت ادامه بدید و به یه مرجع عالی تبدیل بشین.
سلام
با تشکر از زحمتاتون
ببخشید من با یه ارور توی هاست برخورد میکنم ، فایل لاگ رو تو لینک زیر آپلود کردم ، اگه لطف کنید نگاه کنید و کمکم کنید ممنون میشم،با تشکر
ببخشید لینک یادم رفت بزارم!!!
http://s6.uplod.ir/i/00768/glvt57n49wd1.png
سلام،
دو نکته رو مد نظر داشته باشید.
اول اینکه این آموزش برای این نسخه خاص نوشته شده، ممکن هست که تغییراتی در کتابخانه انجام شده باشه.
نکته دوم که به نظرم مشکل کار شماست، تعریف index ارسالی به عنوان اسم فایل هست.
اسمی که داخل کدتون ست کردید با چیزی که مقدارش رو میخواید بخونید، یکی نیست.
سلام
خیلی ممنون از آموزش مفیدتون!
میتونید یه راهنمایی کنید که چجوری درصد فایل آپلود شده رو به کاربر نمایش بدم؟
سلام،
http://goo.gl/4Vbpfs
ببخشید میشه این آموزشو بزارین تو سایت؟اونجا یکم گیج شدم نمیدونم چجوری باید فراخوانی کنم
متاسفانه فرصت نمیشه در یک بحث زیاد دقیق وارد شد. آموزش Retrofit به صورت ویدیویی توسط احمد طحانی در این لینک قابل دسترس هست:
http://atahani.com/retrofit-tutorial/
ببخشید امنیت این کتابخونه نسبت به کتابخانه ها volly و okhttp چجوریه
منظورتون رو متوجه نشدم.
پیادهسازی برقراری امن ارتباط با سرور بر عهده خودتون هست. این کار رو میتونید با access token انجام بدید که
ربطی به کتابخانه اصلیتون نداره. okhttp هم زیر مجموعهای از retrofit هست. جفتشون مال یک شرکت هستند.