استارت‌آپ و کارآفرینی

ارسال فایل با استفاده از Retrofit در اندروید

استفاده از 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 قرار می‌گیره.

12 نظرات
  1. علی می گوید

    معرکه اید
    ممنونم

  2. تلاش می گوید

    بسیار عالی، شما از محدود سایت های فعال در زمینه تولید محتوا هستید و بسیار معرکه اید.

  3. fariborz می گوید

    سلام و یه خسته نباشید جانانه برای زحمات بسیار بسیار با ارزشتون
    خیلی آموزش هاتون عالیه فقط یه موردی رو اگه رعایت کنید ممنون خیلی عالی میشه
    اونم اینه که محل کد هارو مشخص کنید. مثلا بگید توی MainActivity.java فلان رو وارد می کنید.
    که ساختار مشخص تر و واضح تر بشه. مخصوصا برای افراد مبتدی چون من.
    در کل امیدوارم همچنان با قدرت ادامه بدید و به یه مرجع عالی تبدیل بشین.

  4. علی راغبی می گوید

    سلام
    با تشکر از زحمتاتون
    ببخشید من با یه ارور توی هاست برخورد میکنم ، فایل لاگ رو تو لینک زیر آپلود کردم ، اگه لطف کنید نگاه کنید و کمکم کنید ممنون میشم،با تشکر

    1. علی راغبی می گوید

      ببخشید لینک یادم رفت بزارم!!!
      http://s6.uplod.ir/i/00768/glvt57n49wd1.png

      1. بهروز خضری می گوید

        سلام،
        دو نکته رو مد نظر داشته باشید.
        اول اینکه این آموزش برای این نسخه خاص نوشته شده، ممکن هست که تغییراتی در کتابخانه انجام شده باشه.
        نکته دوم که به نظرم مشکل کار شماست، تعریف index‌ ارسالی به عنوان اسم فایل هست.
        اسمی که داخل کدتون ست کردید با چیزی که مقدارش رو می‌خواید بخونید، یکی نیست.

  5. علی می گوید

    سلام
    خیلی ممنون از آموزش مفیدتون!

    میتونید یه راهنمایی کنید که چجوری درصد فایل آپلود شده رو به کاربر نمایش بدم؟

    1. بهروز خضری می گوید
      1. علی می گوید

        ببخشید میشه این آموزشو بزارین تو سایت؟اونجا یکم گیج شدم نمیدونم چجوری باید فراخوانی کنم

        1. بهروز خضری می گوید

          متاسفانه فرصت نمیشه در یک بحث زیاد دقیق وارد شد. آموزش Retrofit‌ به صورت ویدیویی توسط احمد طحانی در این لینک قابل دسترس هست:
          http://atahani.com/retrofit-tutorial/

  6. unko می گوید

    ببخشید امنیت این کتابخونه نسبت به کتابخانه ها volly و okhttp چجوریه

    1. بهروز خضری می گوید

      منظورتون رو متوجه نشدم.
      پیاده‌سازی برقراری امن ارتباط با سرور بر عهده خودتون هست. این کار رو می‌تونید با access token انجام بدید که
      ربطی به کتابخانه اصلی‌تون نداره. okhttp هم زیر مجموعه‌ای از retrofit هست. جفت‌شون مال یک شرکت هستند.

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.