ورود

View Full Version : مشکل در اپلود عکس



techerfan
پنج شنبه 06 دی 1397, 17:10 عصر
با سلام
من یه پروژه ای دارم که توی اون باید عکس رو روی سرور اپلود کنم و برای این کار از کتابخونه volley استفاده میکنم ولی این کتابخونه برای عکسایی با حجم بیشتر از 1 مگابایت کار نمیکنه. به این صورت که خیلی زمان میبره و در اخر هم ارور تایم اوت میده . میخواستم بدونم کسی راه حلی داره که بشه عکس با حجم بالا رو هم اپلود کرد ؟؟ یا این که کلا یه کتابخونه جایگزین پیشنهاد کنه؟؟

کدمم اینه:

public class UploadImage {
private String uploadUrl = "/json_file/image_upload";
private String type = "";
String url = "";
public String uploadImage(final Context context, final String type, final Bitmap bitmap){
this.type = type;
final android.support.v7.app.AlertDialog dialog = new BuildProgressDialog(context).buildDialog().create( );
dialog.show();
StringRequest request = new StringRequest(Request.Method.POST,new DataBaseHelper(context).getUrl()+ uploadUrl,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
url = response;
Toast.makeText(context,response,Toast.LENGTH_SHORT ).show();
dialog.dismiss();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context,error.toString(),Toast.LENG TH_SHORT).show();
dialog.dismiss();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
HashMap<String,String> map = new HashMap<>();
map.put("image",imageToString(bitmap));
map.put("type",type);
return map;
}
};
request.setRetryPolicy(new DefaultRetryPolicy( 50000, 5, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
MySingleton.getInstance(context).addToRequestque(r equest);
return url;
}


public String imageToString(Bitmap bitmap){
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
if (type.equals("jpeg")){
bitmap.compress(Bitmap.CompressFormat.JPEG,100,byt eArrayOutputStream);
} else if (type.equals("png")){
bitmap.compress(Bitmap.CompressFormat.PNG,100,byte ArrayOutputStream);
}


byte[] imgBytes = byteArrayOutputStream.toByteArray();
return Base64.encodeToString(imgBytes,Base64.DEFAULT);
}
}

Nevercom
پنج شنبه 06 دی 1397, 17:18 عصر
این ارتباطی به Volley نداره. باید تنظیمات سرور رو به شکلی تغییر بدید که محدودیت سایز برای آپلود کمتر بشه

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

techerfan
پنج شنبه 06 دی 1397, 22:00 عصر
سرور هیچ محدودیتی نداره.
از طرفی هم نمیخوام فایل دستکاری بشه و از کیفیتش کم شه.

Nevercom
دوشنبه 10 دی 1397, 09:04 صبح
به هرحال یک سری محدودیت ها بصورت دیفالت وجود داره. بعنوان مثال وب سرور Nginx در تنظیمات پیشفرضش برای حجم فایلی که می‌تونه اپلود بشه محدودیت قرار داده. همچنین مفسر PHP محدودیت هایی داره، مثلن حداکثر حجم فایل، یا موردی که شما بهش اشاره کردید، هر اسکریپت باید تا حداکثر ۱ دقیقه پاسخ رو ارسال کنه وگرنه پروسه بسته میشه و تایم اوت میده.
ابتدا باید بسته به زبان سمت سرور و وب‌سرور مورد استفاده، تغییراتی بدید تا بتونید فایل‌های حجیم تر رو آپلود کنید.

اگر خیلی مهم هست که فایل‌های خیلی حجیم رو آپلود کنید، شاید لازم باشه از الگوهای دیگه برای آپلود استفاده کنید، مثلن یک روش این هست که فایل رو تکه تکه (chunk) به سرور ارسال کنید، و البته سمت سرور هم باید کدتون این مورد رو پشتیبانی کنه.