`

Android 程序使用http上传文件

阅读更多
Android程序使用http上传文件

有时,在网络编程过程中需要向服务器上传文件。Multipart/form-data是上传文件的一种方式。

Multipart/form-data其实就是浏览器用表单上传文件的方式。最常见的情境是:在写邮件时,向邮件后添加附件,附件通常使用表单添加,也就是用multipart/form-data格式上传到服务器。


<form action=“/TestWeb/command=UpdatePicture” method=”post” enctype=”multipart/form-data”>
	<input type=”file” name=”uploadfile1”/><br>
	<input type=”file” name=”uploadfile2”/><br>
	<input type=”submit” value=”uploadfile”>
</form>




内容如下:
Type:multipart/form-data; boundary=-----------------------------265001916915724

-----------------------------265001916915724
Content-Disposition: form-data; name="uploadfile1"; filename="web.txt"
Content-Type: text/plain

ChinaNetSNWide 
å­ç½‘æŽ©ç 255.255.255.255 简单的说四个255是全广播IP地址。就是用来从DHCP服     务器那里莕取IP地址。
默认网关0.0.0.0 即本机

-----------------------------265001916915724
Content-Disposition: form-data; name="uploadfile2"; filename="20080116064637581.jpg"
Content-Type: image/jpeg

ÿØÿà

-----------------------------265001916915724—


注意点一:
      Header 下面boundary 有27个 -(横杆)
      POST Data 下面传输每个文件的开头是有29个 -
注意点二:
      观察POST Data可以发现从第一个-----------------------------265001916915724
      到第二个-----------------------------265001916915724之间为一个txt文件的相关
      信息。
上面form提交的servlet不用实现,只是解析了http协议,为下面模拟铺垫。

下面实现android客户端上传图片到服务端的servlet
android客户端代码
 public void upload() {
        Log.d(TAG, "upload begin");
        HttpURLConnection connection = null;
        DataOutputStream dos = null;
        FileInputStream fin = null;
        
        String boundary = "---------------------------265001916915724";
        // 真机调试的话,这里url需要改成电脑ip
        // 模拟机用10.0.0.2,127.0.0.1被tomcat占用了
        String urlServer = "http://10.0.0.2:8080/TestWeb/command=UpdatePicture";
        String lineEnd = "\r\n";
        String pathOfPicture = "/sdcard/aaa.jpg";
        int bytesAvailable, bufferSize, bytesRead;
        int maxBufferSize = 1*1024*512;
        byte[] buffer = null;
        
        try {
            Log.d(TAG, "try");
            URL url = new URL(urlServer);
            connection = (HttpURLConnection) url.openConnection();
            
            // 允许向url流中读写数据
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setUseCaches(true);
            
            // 启动post方法
            connection.setRequestMethod("POST");
            
            // 设置请求头内容
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("Content-Type", "text/plain");
            
            // 伪造请求头
            connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
          
           
            // 开始伪造POST Data里面的数据
            dos = new DataOutputStream(connection.getOutputStream());
            fin = new FileInputStream(pathOfPicture);
            
            Log.d(TAG, "开始上传images");
            //--------------------开始伪造上传images.jpg的信息-----------------------------------
            String fileMeta = "--" + boundary + lineEnd +
                            "Content-Disposition: form-data; name=\"uploadedPicture\"; filename=\"" + pathOfPicture + "\"" + lineEnd +
                            "Content-Type: image/jpeg" + lineEnd + lineEnd;
            // 向流中写入fileMeta
            dos.write(fileMeta.getBytes());
            
            // 取得本地图片的字节流,向url流中写入图片字节流
            bytesAvailable = fin.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];
            
            bytesRead = fin.read(buffer, 0, bufferSize);
            while(bytesRead > 0) {
                dos.write(buffer, 0, bufferSize);
                bytesAvailable = fin.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fin.read(buffer, 0, bufferSize);
            }
            dos.writeBytes(lineEnd+lineEnd);
            //--------------------伪造images.jpg信息结束-----------------------------------
            Log.d(TAG, "结束上传");
            
            // POST Data结束
            dos.writeBytes("--" + boundary + "--");
            
            // Server端返回的信息
            System.out.println("" + connection.getResponseCode());
            System.out.println("" + connection.getResponseMessage());
            
            if (dos != null) {
                dos.flush();
                dos.close();
            }
            Log.d(TAG, "upload success-----------------------------------------");
        } catch (Exception e) {
           e.printStackTrace();
           Log.d(TAG, "upload fail");
        }
    }


服务端servlet
import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 利用该组件进行接收客户端上传的文件
// 需要自己加载commons-fileupload-1.2.2.jar和commons-io-2.1.jar
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class ReceivePictureFromAndroid
 */
@WebServlet("/command=UpdatePicture")
public class ReceivePictureFromAndroid extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public ReceivePictureFromAndroid() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
	    try {
	      DiskFileItemFactory factory = new DiskFileItemFactory();
	      ServletFileUpload upload = new ServletFileUpload(factory);
	      List<FileItem> list = upload.parseRequest(request);
	      System.out.println(list + " list " + list.size() );
	      for(FileItem item : list) {
	          String paramName = item.getFieldName();
	          System.out.println(paramName);
	          String paramValue = item.getString();
	          System.out.println(paramValue);
	          if(item.isFormField() == false) {
	              File f = new File("f:\\img.jpg");
	              item.write(f);
	               System.out.println("write filt success");
	          }
	      }
	    } catch (Exception e) {   
	        e.printStackTrace();
	    }
	}

}


  • 大小: 114.8 KB
1
1
分享到:
评论
1 楼 wuxifu001 2013-07-26  

相关推荐

    android大文件分段上传

    在标题"android大文件分段上传"中提到的方法,是通过使用Socket流将大文件分段进行上传,这是一种有效应对大文件传输问题的策略。下面我们将详细探讨这一技术。 首先,了解Socket的基本概念。Socket是网络编程中的...

    Android多线程文件上传

    2. 多线程上传:为了解决这个问题,开发者可以使用多线程同时上传文件的不同部分。这种方式可以显著缩短总体上传时间,特别是在网络环境不稳定或上传文件较大的情况下。 三、实现多线程上传 1. 使用AsyncTask:...

    Android实现亚马逊S3文件上传

    - 上传文件:调用`S3TransferUtility.upload()`方法,传入目标Bucket名称、对象键(Key)、本地文件路径。例如: ```java S3TransferUtility transferUtility = S3TransferUtility.create(this, s3Client); ...

    android使用socket上传、下载文件

    本篇将详细讲解如何在Android应用中使用Socket进行文件的上传和下载操作。 首先,理解Socket的基本概念:Socket是应用程序与网络协议之间的接口,它允许两个网络应用程序通过TCP/IP协议进行通信。在Android中,我们...

    android文件上传demo

    在Android平台上进行文件上传是一项常见的任务,特别是在开发涉及用户交互的应用程序时,如社交媒体应用、云存储服务等。本文将详细讲解如何在Android中实现文件上传功能,主要围绕"android文件上传demo"这一主题,...

    android通过http上传文件到服务器

    在Android应用开发中,...总的来说,实现Android通过HTTP上传文件到服务器涉及客户端的HTTP请求构建和服务器端的Servlet处理。理解这个过程,开发者可以有效地在Android应用中集成文件上传功能,与服务器进行数据交互。

    修改好的移动端android和服务端java上传文件程序

    本项目提供的“修改好的移动端android和服务端java上传文件程序”就是一个完整的解决方案,包含了客户端Android应用和基于Servlet 3.0的服务端Java代码。下面我们将详细探讨这个程序的关键知识点。 首先,Android端...

    android开发上传文件

    在Android开发中,上传文件是一项常见的任务,尤其在涉及到用户交互、数据同步或者服务端处理时更为重要。这里,我们主要关注的是如何在Android应用程序中实现文件上传到服务器的功能。这个场景通常涉及到网络编程和...

    Android程序研发源码Android 手机文件上传示例.zip

    在Android程序开发中,文件上传是一项常见的功能,例如用户可能需要将照片、视频或文档上传到云端服务器。这个"Android程序研发源码Android 手机文件上传示例.zip"压缩包提供了一个关于如何在Android应用中实现文件...

    Android文件上传+服务器

    Android上传文件通常涉及`Multipart/form-data`编码方式,这是HTTP协议中用于处理多部分数据的一种格式,常用于文件上传。通过在请求头设置`Content-Type: multipart/form-data`,然后将文件内容作为请求体的一部分...

    Android文件上传.rar

    请求中需要包含上传文件的Content-Type和实际的文件数据。 4. **使用MultipartEntity或RequestBody**:对于包含文件的数据,我们通常使用MultipartEntity(如果你使用的是Apache HttpClient)或RequestBody(如果你...

    android手写Http协议上传文件

    "android手写Http协议上传文件"这个主题就是关于如何利用Socket编程实现一个简单的HTTP协议来上传本地文件到服务器的过程。下面将详细讲解这个过程涉及的关键知识点。 1. **HTTP协议基础**: HTTP(超文本传输协议...

    android上传大文件亲测可用

    在Android平台上进行大文件上传是一项常见的任务,尤其在开发音乐分享、视频分享或者备份应用时。本篇将详细探讨如何在Android中实现大文件的高效上传,以200MB文件为例,阐述如何通过Socket通信在3分钟内完成传输。...

    Android 手机文件上传示例.zip

    在Android平台上,文件上传是一个常见的任务,特别是在移动应用开发中,如社交应用、云存储服务等,都需要用户能够上传图片、文档等数据。本示例将重点讲解如何在Android手机上实现文件上传功能。 首先,我们需要...

    Android上传文件到服务器

    本文将详细讲解如何实现Android应用程序上传文件到FTP(File Transfer Protocol)服务器,包括单文件和多文件上传的实现方法。 首先,我们需要理解FTP的基本概念。FTP是一种用于在网络上进行文件传输的标准协议,...

    Android 文件实现断点上传

    断点续传是指在网络连接中断后,应用程序能够记住上次上传的位置,并从这个位置继续上传,而不是重新开始整个文件的传输。这需要服务器端和客户端之间进行一定的通信,以便保存和恢复上传的状态。 在Android中,...

    Android捕获异常并实现文件的上传

    本教程将详细讲解如何在Android中捕获未被捕获的异常(Uncaught Exceptions)以及如何利用Retrofit网络库实现文件上传。 首先,我们来探讨如何在Android中实现异常捕获。Android系统提供了`Thread....

    android手机文件上传和下载

    本教程主要涵盖两个方面:Android手机文件的上传和下载,以及如何使用XAMPP搭建后端服务器。 1. **Android 文件上传下载** Android系统提供了多种API来处理文件的读写和网络通信,如`HttpURLConnection`,`OkHttp`...

    Android客户端上传数据到tomcat服务端的源码

    3. Multipart/form-data:如果需要上传文件,通常采用Multipart/form-data编码,这样可以同时上传文本数据和二进制文件。Android的OkHttp库支持这种方式,通过RequestBody创建FormData。 4. 文件选择器:在Android...

Global site tag (gtag.js) - Google Analytics