English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ejemplo práctico
Al implementar un cliente de servicio web de Android, como un cliente de Weibo o un cliente de foro, a menudo se utiliza la subida y descarga de imágenes. Aquí se describe cómo utilizar HttpClient para implementar las funciones de subida y descarga de imágenes.
1 Subida de imágenesAl subir una imagen, primero obtener la ruta de la imagen, crear un archivo, y convertir la imagen en un flujo de bytes y escribirlo en el request, luego enviar la solicitud.
Código del cliente:
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",/octeto-stream"); HttpResponse response; try { request.setEntity(entity); entity.setContentEncoding("binary/octeto-stream"); response = httpClient.execute(request); //Si el estado de devolución es200, obtener el resultado de la devolución if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ ……//La carga de la imagen fue exitosa } } catch(Exception e){ }
El trabajo realizado por el lado del servidor es recibir el flujo de bytes, escribirlo en el archivo, guardar el archivo en la carpeta correspondiente del servidor y registrar la ruta del archivo, escribir la ruta del archivo de imagen en la base de datos para su almacenamiento.
Código del lado del servidor:
//Obtener el ID de la noticia String gid = request.getParameter("gid"); String filePath = getRealPath(request) + "\\userpic\\"; // Definir el tamaño máximo de bytes del archivo subido int MAX_SIZE = 102400 * 102400; // Declarar la clase de lectura de archivos DataInputStream in = null; FileOutputStream fileOut = null; // Obtener el tipo de datos subidos por el cliente String contentType = request.getContentType(); if(contentType.indexOf("binary/octeto-(stream") >= 0){ // Leer los datos subidos in = new DataInputStream(request.getInputStream()); int formDataLength = request.getContentLength(); // Si la imagen es demasiado grande if(formDataLength > MAX_SIZE){ String errormsg=("El número de bytes del archivo subido no puede superar " + MAX_SIZE); out.println(errormsg); return ; } // Guardar los datos del archivo subido byte dataBytes[] = new byte[formDataLength]; int byteRead = 0; int totalBytesRead = 0; // Los datos subidos se almacenan en el array de bytes 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, "¡Fallo de conexión!", Toast.LENGTH_SHORT).show(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return bitmap; }
Los lectores interesados en más contenido relacionado con Android pueden ver la sección especial de este sitio: "Resumen de técnicas de procesamiento de gráficos e imágenes en Android", "Tutoriales de inicio y avanzado de desarrollo de Android", "Resumen de técnicas de depuración y resolución de problemas comunes en Android", "Resumen de técnicas de operaciones multimedia en Android (audio, video, grabación, etc.)", "Resumen de uso de componentes básicos en Android", "Resumen de técnicas de vistas View en Android", "Resumen de técnicas de diseño de layout en Android" y "Resumen de uso de controles en Android".
Espero que lo descrito en este artículo pueda ayudar a todos en el diseño de programas Android.
Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha procesado editorialmente y no asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#w proporcionando evidencia relevante, una vez que se verifique, este sitio web eliminará inmediatamente el contenido sospechoso de infracción.3Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha procesado editorialmente y no asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#w proporcionando evidencia relevante, una vez que se verifique, este sitio web eliminará inmediatamente el contenido sospechoso de infracción.