English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

مثال على تحقيق وظيفة تحميل وتنزيل الصور في Android

مثال

عند تنفيذ عميل خدمة الويب لـ Android، مثل عميل واتساب، عميل منتدى، غالبًا ما يتم استخدام رفع وتنزيل الصور. هنا نشرح كيفية استخدام HttpClient لتحقيق وظائف رفع وتنزيل الصور.

1 رفع الصورة:عند رفع الصورة، أولاً نحصل على مسار الصورة، نخلق ملفًا، ونحوّل الصورة إلى تدفق من البايتات ونكتبها في الطلب ونرسل الطلب.

كود العميل

File file = new File(imageUrl);
String httpUrl = httpDomain+"AddImageServlet"+"?gid="+gid;
HttpPost request = new HttpPost(httpUrl);
HttpClient httpClient = new DefaultHttpClient();
FileEntity entity = new FileEntity(file,"binary/octet-stream");
HttpResponse response;
try {
  request.setEntity(entity);
  entity.setContentEncoding("binary/octet-stream");
  response = httpClient.execute(request);
// إذا كان الرقم الموجود في حالة الرد 200، فحصلنا على النتيجة التي تم الحصول عليها
إذا (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
……//نجاح تحميل الصورة
}
}
catch(Exception e){
}

عملية الخادم تتكون من استقبال تدفق البايتات، كتابة هذه البايتات في ملف، حفظ هذا الملف في مجلد مختار في الخادم، وتسجيل مسار الملف، وكتابة مسار ملف الصورة في قاعدة البيانات للحفظ.

الشفرة الخاصة بالخادم:

//获得新闻id
String gid = request.getParameter("gid");
String filePath = getRealPath(request) + "\\userpic\\";
//   定义上载文件的最大字节
int MAX_SIZE = 102400 * 102400;
//   声明文件读入类
DataInputStream in = null;
FileOutputStream fileOut = null;
//   取得客户端上传的数据类型
String contentType = request.getContentType();
if(contentType.indexOf("binary/octet-stream") >= 0){
  //   读入上传的数据
  in = new DataInputStream(request.getInputStream());
  int formDataLength = request.getContentLength();
  // 如果图片过大
  if(formDataLength > MAX_SIZE){
    String errormsg=("上传的文件字节数不可以超过" + MAX_SIZE);
    out.println(errormsg);
    return ;
  }
//   保存上传文件的数据
byte dataBytes[] = new byte[formDataLength];
int byteRead = 0;
int totalBytesRead = 0;
//   上传的数据保存在byte数组
while(totalBytesRead < formDataLength){
byteRead = in.read(dataBytes,totalBytesRead,formDataLength);
totalBytesRead += byteRead;
 }
String fileName = filePath + gid+".png";
 //   检查上载文件的目录是否存在
File fileDir = new File(filePath);
if(!fileDir.exists()){
fileDir.mkdirs();
}
//   创建文件的写出类
fileOut = new FileOutputStream(fileName);
//   保存文件的数据
fileOut.write(dataBytes);
fileOut.close();
//保存文件的路径名
……

2 图片下载:首先获得网络图片的图片地址,发送请求后,服务器将会返回该图片的字节流,利用BitmapFactory.decodeStream()方法将字节流转化为图片并返回。具体代码如下:

//获得网络中的图片
public Bitmap getGossipImage(String gid){
    String httpUrl = httpDomain+"userpic/"+gid+".png";
    Bitmap bitmap = null;
    HttpGet httpRequest = new HttpGet(httpUrl);
    //取得HttpClient 对象
    HttpClient httpclient = new DefaultHttpClient();
    try {
      //请求httpClient ,取得HttpRestponse
      HttpResponse httpResponse = httpclient.execute(httpRequest);
      if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
        //取得相关信息 取得HttpEntiy
        HttpEntity httpEntity = httpResponse.getEntity();
        InputStream is = httpEntity.getContent();
        bitmap = BitmapFactory.decodeStream(is);
        is.close();
      } else {
         Toast.makeText(context, "فشل الاتصال!", Toast.LENGTH_SHORT).show();
      }
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return bitmap;
}

بالنسبة للقراء المهتمين بالمزيد من المعلومات المتعلقة بAndroid، يمكنهم الرجوع إلى موضوعات هذا الموقع: "تجميع تقنيات معالجة الصور والرسوم البيانية في Android"، "دليل البدء والتقدم في تطوير Android"، "تجميع تقنيات التشخيص والتعامل مع المشاكل الشائعة في Android"، "تجميع تقنيات التشغيل المتعددة للمتوسعيات في Android (الصوت، الفيديو، التسجيل، إلخ)"، "تجميع استخدامات المكونات الأساسية في Android"، "تجميع تقنيات المكونات المرئية View في Android"، "تجميع تقنيات التخطيط layout في Android"، وكذلك "تجميع استخدامات المكونات في Android".

آمل أن يساعدك محتوى هذا المقال في تصميم برامج Android.

بيان: محتويات هذا المقال تم جمعها من الإنترنت، ملكية المادة تخص المالك الأصلي، تم جمع المادة من قبل المستخدمين عبر الإنترنت بشكل تلقائي، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل إنساني، ولا يتحمل هذا الموقع أي مسؤولية قانونية ذات صلة. إذا اكتشفت أي محتوى يشتبه في انتهاك حقوق النسخ، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لإبلاغنا، وقدم الدليل على الدليل، إذا تم التحقق من صحة الشكوى، سيتم حذف المحتوى المزعوم فوراً.

أعجبك ذلك