آموزش ارسال چندین عکس یا فایل یا ویدیو به سرور به صورت داینامیک( آپدیت خواهد شد)
میخواهیم چندین عکس یا فیلم یا فایل در قالب فایل به سرور ارسال نماییم. این آموزش به درد چه کسانی میخورد، به درد کسانی میخورد که میخوان عکسها یا فیلم یا فایلها در سرور ذخیره کنن و آدرس ذخیره شدن آن را در دیتابیس بریزن، این روش بسیار قابل توجیه هست و اکثر کمپانیهای بزرگ، مثلا برای آپلود کردن عکسهای کاربران خودش ابتدا عکس را در سرور ذخیره میکنن و آدرس عکس را در دیتابیس ذخیره میکنن و علت فنی هم دلایل زیادی دارد.ضمن اینکه این آموزش بیشتر جنبه آموزشی دارد ولی به درد پروژهای کاربردی خیلی میخورد. قبل از انجام این کار چند نکته را بگم:
1- از کتابخانه Okhttp3 استفاده خواهیم کرد، علت استفاده نکردن از کتابخونه volley فقط در قالب استرینگ میتوان به سرور ارسال کرد ( یکی از معایباش)
2- ما در این آموزش فعلا برای ارسال عکس آموزش میدهیم، اما کدهایی که نمایش میدهیم میتونین به جای عکس، فیلم یا فایل ارسال نمایید.
3- ما در این آموزش نحوه انتخاب کردن عکسها رو آموزش نمیدهیم، فرض میکنیم ما آدرس عکسها رو در یک آرایه ذخیره کردیم. یا اگر آدرس عکسها رو ندارین میتونین در گوگل یا آموزش سایت استفاده کنین.
4- قبل از شروع کتابخونه در Gradle اضافه کنین : compile 'com.squareup.okhttp3:okhttp:3.4.1'
5- در صورت امکان مستنداتت این کتابخونه را مطالعه نمایید.
6- یکی از دلایلی که ما از Base64 استفاده نمیکنیم در سمت سرور باید عکس کانورت بشه و عکس بالای 20% به حجم عکس اضافه میشه و غیر قابل توجیه هست.
7- در یکی از کدهای زیر buildernew.addFormDataPart("uploaded_file[]",String.valueOf(i)+".png", RequestBody.create(MEDIA_TYPE, sourceFile[i]));
این کد 3 تا پارامتر میگیرد: پارامتر اول اسم پارامتری که قراره سرور آنرا بخواند، پارامتر دوم نام فایل ( بهتر هست پرایمیر کی یوزر دبتابیس بفرستین اما برای قابل فهم من از عدد استفاده کردم، پارامتر سوم سورس عکسها یا همون سورسی که عکسها رو به فایل تبدیل کردیم
8- کد PHP در پست بعدی قرار خواهد گرفت.
9- در کد php برای خلوت شدن دستورات دیتابیس رو حذف کردم، فقط نحوه خواندن اطلاعات از سمت اندروید به سرور را نوشتم .
10 - چرا بکگراند کدها این رنگی شد :دی. این کدها را کپی پست کنین یه جایی قابل فهم تر خواهد بود :دی.
11- به زودی آموزش ترکیبی از volley و این کتابخونه، و نحوه مدیریت کردن انتخاب چندین عکس به صورت imagePicker و کد بهینه تر و حرفه ای تر قرار خواهم داد.
شروع:
public void uploadImage(ArrayList<String> mSelectPath){ // mSelectPath آرایه ای که آدرس عکسها رو ذخیره کردیم File sourceFile[] = new File[mSelectPath1.size()];// تعداد عکسهایی که در آرایه هست for (int i=0;i<mSelectPath.size();i++){ sourceFile[i] = new File(mSelectPath1.get(i)); // همه عکسها به فایل تبدیل میشود } String url = "UrlAddress";// آدرس سرور final MediaType MEDIA_TYPE = mSelectPath.get(0).endsWith("png") ? // فرمت عکسهایی که میخواهیم به سرور ارسال نماییم MediaType.parse("image/png") : MediaType.parse("image/jpeg"); MultipartBody.Builder buildernew = new MultipartBody.Builder() .setType(MultipartBody.FORM); buildernew.addFormDataPart("action","uploadimage");// ارسال پارامتر به سرور for (int i = 0; i < mSelectPath.size(); i++) { buildernew.addFormDataPart("uploaded_file[]",String.valueOf(i)+".png", RequestBody.create(MEDIA_TYPE, sourceFile[i])); } MultipartBody requestBody = buildernew.build(); OkHttpClient client = new OkHttpClient(); okhttp3.Request request = new okhttp3.Request.Builder() .url(url) .post(requestBody) .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, okhttp3.Response response) throws IOException { try { String resp = response.body().string(); Log.v("respons is ok", resp);// جوابی که از سرور میگیریم if(response.isSuccessful()) { } else { } } catch(IOException e) { Log.e("respons is not Ok", "Exception caught: ", e); } } }); }
<?php if (isset($_REQUEST['action'])){ $action = $_REQUEST['action']; } else { echo "Invalid Data"; exit; }
if($action=="uploadimage") { uploadimage(); }
function uploadImage(){ foreach ($_FILES["uploaded_file"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["uploaded_file"]["tmp_name"][$key]; $name = $_FILES["uploaded_file"]["name"][$key]; $file_path = "محدل آدرس ذخیره فایللها "; $file_path = $file_path . $name; if(@move_uploaded_file($tmp_name, $file_path)) { echo "Success"; } else{ echo "fail"; } } } }
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .