`

android文件上传到服务器

 
阅读更多
代码非原创,fix了bug,完善的还是需要再思量:
/**
* 通过拼接的方式构造请求内容,实现参数传输以及文件传输
* @param actionUrl
* @param params
* @param files
* @return
* @throws IOException
*/
public static String post(String actionUrl, Map<String, String> params,
    Map<String, File> files) throws IOException {

  String BOUNDARY = java.util.UUID.randomUUID().toString();
  String PREFIX = "--" , LINEND = "\r\n";
  String MULTIPART_FROM_DATA = "multipart/form-data";
  String CHARSET = "UTF-8";

  URL uri = new URL(actionUrl);
  HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
  conn.setReadTimeout(5 * 1000); // 缓存的最长时间
  conn.setDoInput(true);// 允许输入
  conn.setDoOutput(true);// 允许输出
  conn.setUseCaches(false); // 不允许使用缓存
  conn.setRequestMethod("POST");
  conn.setRequestProperty("connection", "keep-alive");
  conn.setRequestProperty("Charsert", "UTF-8");
  conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);

  // 首先组拼文本类型的参数
  StringBuilder sb = new StringBuilder();
  for (Map.Entry<String, String> entry : params.entrySet()) {
    sb.append(PREFIX);
    sb.append(BOUNDARY);
    sb.append(LINEND);
    sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);
    sb.append("Content-Type: text/plain; charset=" + CHARSET+LINEND);
    sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
    sb.append(LINEND);
    sb.append(entry.getValue());
    sb.append(LINEND);
  }

  DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
  outStream.write(sb.toString().getBytes());
  // 发送文件数据
  if(files!=null){
    int i = 0;
    for (Map.Entry<String, File> file: files.entrySet()) {
      StringBuilder sb1 = new StringBuilder();
      sb1.append(PREFIX);
      sb1.append(BOUNDARY);
      sb1.append(LINEND);
      sb1.append("Content-Disposition: form-data; name=\"file"+(i++)+"\"; filename=\""+file.getKey()+"\""+LINEND);
      sb1.append("Content-Type: application/octet-stream; charset="+CHARSET+LINEND);
      sb1.append(LINEND);
      outStream.write(sb1.toString().getBytes());

      InputStream is = new FileInputStream(file.getValue());
      byte[] buffer = new byte[1024];
      int len = 0;
      while ((len = is.read(buffer)) != -1) {
        outStream.write(buffer, 0, len);
      }

      is.close();
      outStream.write(LINEND.getBytes());
    }
  }
 
  //请求结束标志
  byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
  outStream.write(end_data);
  outStream.flush();

  //得到响应码
  int res = conn.getResponseCode();
  InputStream in = null;
  if (res == 200) {
    in = conn.getInputStream();
    int ch;
    StringBuilder sb2 = new StringBuilder();
    while ((ch = in.read()) != -1) {
      sb2.append((char) ch);
    }
  }
  return in == null ? null : in.toString();
}


最简单的PHP测试代码:
if($_FILES){
  foreach($_FILES as $v){
    copy($v[tmp_name], $v[name]);
  }
}


参考自 Android中发送Http请求实例(包括文件上传、servlet接收) ,修复了几个问题:
1 多文件上传 file"+(i++)+"
2 返回的错误

另外还可以看看这个(我没测试) android 文件上传的类--完整 可以直接被调用的

这有一个从协议上分析的,比较牛叉:Android下的应用编程——用HTTP协议实现文件上传功能

原创内容如转载请注明:来自 阿权的书房 <script> //&lt;![cdata[ document.write(&quot;&lt;br /&gt;本帖地址:&lt;a href=\&quot;&quot;+window.location+&quot;\&quot;&gt;&quot;+window.location+&quot;&lt;/a&gt;&quot;); //]]&gt; </script>
本帖地址:http://www.aslibra.com/blog/post/android-upload-files-to-server.php


http 上传文件的方法

Java代码  收藏代码
  1. /**
  2.          *
  3.          * sendMultipartDataToHttpServer
  4.          * 使用post方法请求web服务器,并且当表单数据为:multipart/form-data格式。http请求使用{@link#HTTP_ENCODING}编码<br/>
  5.          * 返回json数据,支持文件名中文上传和多文件上传,不支持断点上传,要正确编码服务端返回{@link#HTTP_ENCODING}编码<br/>
  6.          * @param url
  7.          * @param files 文件表单域
  8.          * @param fields 非文件表单域
  9.          * @return JSONObject
10.          * @throws Exception
11.          * @exception
12.          * @since  1.0.0
13.          */ 
14.         public static JSONObject sendMultipartDataToHttpServer(URL url, 
15.                         final Map<String, File> files, final Map<String, String> fields, 
16.                         final UsernamePasswordCredentials credentials) throws IOException ,JSONException,Exception{ 
17.                 URL myurl = null; 
18.                 String queryString = ""; 
19.                 // 其他的表单域 
20.                 if (fields != null) { 
21.                         for (Map.Entry<String, String> entry : fields.entrySet()) { 
22.                                 queryString += "&" + URLEncoder.encode(entry.getKey(),HTTP_ENCODING) + "=" 
23.                                                 + URLEncoder.encode(entry.getValue(), HTTP_ENCODING); 
24.                         } 
25.                 } 
26.                 if (!queryString.equals("")) { 
27.                         queryString = queryString.replaceFirst("&", "?"); 
28.                 } else { 
29.                 } 
30. 
 
31.                 myurl = new URL(url.getProtocol(), url.getHost(),url.getPort(), url.getPath() 
32.                                 + queryString); 
33.                 HttpURLConnection conn = (HttpURLConnection) myurl.openConnection(); 
34.                 conn.setConnectTimeout(UPLOAD_REQUEST_TIMEOUT); 
35.                 conn.setRequestMethod(HTTP_METHOD.POST.toString()); 
36.                 conn.setDoInput(true); 
37.                 conn.setDoOutput(true); 
38.                 conn.setUseCaches(false); 
39. 
 
40.                 String boundary = "laohuidi_" + java.util.UUID.randomUUID().toString() 
41.                                 + "_laohuidi"; 
42.                 conn.setRequestProperty( 
43.                                                 "Accept", 
44.                                                 "image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,application/x-shockwave-flash,application/x-quickviewplus,*/*"); 
45.                 conn.setRequestProperty("keep-alive", "300"); 
46.                 conn.setRequestProperty( 
47.                                                 "user-agent", 
48.                                                 "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 GTB6"); 
49.                 conn.setRequestProperty("accept-language", "zh-cn,zh;q=0.5"); 
50.                 conn.setRequestProperty("Connection", "Keep-Alive"); 
51.                 conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+ boundary); 
52. 
 
53.                 DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); 
54.                 // 乱码问题 可以试下 PrintWriter out = new PrintWriter(new 
55.                 // OutputStreamWriter(connection.getOutputStream(),"utf-8")); 
56.                 dos = new DataOutputStream(conn.getOutputStream()); 
57.                 int bytesRead, bytesAvailable, bufferSize; 
58.                 byte[] buffer; 
59.                 int maxBufferSize = IO_BUFFER_SIZE; 
60.                 String tem = ""; 
61.                 if(files!=null) 
62.                 for (Map.Entry<String, File> entry : files.entrySet()){ 
63.                         // 分隔符开头 
64.                         dos.writeBytes(TWO_HYPHENS + boundary + LINEND); 
65.                         // create a buffer of maximum size 
66.                         FileInputStream fileInputStream = new FileInputStream(entry.getValue()); 
67.                         bytesAvailable = fileInputStream.available(); 
68.                         bufferSize = Math.min(bytesAvailable, maxBufferSize); 
69.                         buffer = new byte[bufferSize]; 
70.                         // read file and write it into form... 
71.                         bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
72.                         tem = entry.getValue().getName(); 
73.                         dos.writeBytes("Content-Disposition:form-data;name=\""+entry.getKey()+"\";"+ "filename=\""); 
74.                         dos.writeUTF(tem);// 中文的文件名使用这里 
75.                         dos.writeBytes("\"" + LINEND); 
76.                         dos.writeBytes("Content-Type:image/jpg" + LINEND + LINEND);//类型的判断暂时不处理 
77.                         while (bytesRead > 0) { 
78.                                 dos.write(buffer, 0, bufferSize); 
79.                                 bytesAvailable = fileInputStream.available(); 
80.                                 bufferSize = Math.min(bytesAvailable, maxBufferSize); 
81.                                 bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
82.                         } 
83.                         // close streams 
84.                         fileInputStream.close(); 
85.                         dos.writeBytes(LINEND); 
86.                 } 
87.                 // http 结束符 
88.                 dos.writeBytes(TWO_HYPHENS + boundary + TWO_HYPHENS); 
89.                 dos.writeBytes(LINEND); 
90. 
 
91.                 dos.flush(); 
92.                 dos.close(); 
93.                 // 返回类型 
94.                 String responseType = conn.getHeaderField("Content-Type"); 
95.                 // 正常返回而且必须为json类型 
96.                 if (conn.getResponseCode() == HttpURLConnection.HTTP_OK 
97.                                 && responseType != null 
98.                                 && responseType.indexOf(HTTP_JSON_TYPE) >= 0) { 
99.                         responseType = (convertStreamToString(conn.getInputStream())); 
100. 
 
101.                 } else { 
102.                         responseType = "{}"; 
103.                 } 
104.                 try{conn.disconnect();}catch(Exception e){} 
105.                 return new JSONObject(responseType); 
106.         } 
分享到:
评论

相关推荐

    android 选择文件上传至服务器 包含服务器代码

    在Android应用开发中,文件上传是一项常见的功能,例如用户可能需要将照片、文档或音频文件发送到服务器进行存储或处理。本教程将详细介绍如何在Android客户端实现文件选择并上传至服务器,同时提供服务器端的处理...

    Android文件上传+服务器

    本文将深入探讨Android如何实现文件上传到服务器,并结合提供的`UploadTest`和`UploadExample`两个示例项目进行讲解。 1. **HTTP协议与文件上传** 文件上传通常基于HTTP或HTTPS协议,利用POST或PUT方法将文件数据...

    安卓上传文件到服务器源码

    在安卓平台上进行文件上传到服务器的操作是移动应用开发中的常见任务,这通常涉及到网络编程、HTTP请求以及数据处理等技术。下面将详细讲解这个过程涉及的知识点。 首先,我们需要了解安卓系统中的网络通信机制。...

    android上传文件到服务器(客户端加服务端源码)

    在Android平台上,将文件上传至服务器是一项常见的任务,尤其在开发涉及用户数据交互的应用时。本教程将深入探讨如何实现这一功能,同时提供客户端和服务端的源码示例,特别关注多文件上传的处理。 首先,客户端...

    上传文件到服务器

    在IT领域中,文件上传是一项非常常见的操作,它涉及到将本地计算机上的文件传输到远程服务器上。这一过程广泛应用于各种场景,比如网站开发、软件部署、数据备份等。理解如何有效地上传文件对于IT专业人士来说至关...

    Android上传文件到 net服务器 包含两方代码

    在Android平台上将文件上传到.NET服务器是一项常见的任务,涉及到客户端(Android)与服务器端(.NET)的交互。本文将详细讲解如何实现这一过程,并提供相关的代码示例。 首先,客户端(Android)需要使用HTTP或者...

    android上传文件到服务器

    在Android平台上,将文件上传至服务器是常见的任务,尤其在处理用户生成的图片、音频或视频内容时。本文将深入探讨如何实现这一功能,并提供关键知识点。 首先,我们需要理解网络请求的基本原理。在Android中,最...

    Android-AndroidLog日志打印输出到文件方便查看和上传到服务器

    4. **文件上传功能**:应用可能包含一个接口,允许用户触发日志文件的上传操作,这些文件可以通过HTTP请求发送到服务器。上传可能需要用户确认,以保护他们的隐私。 5. **权限管理**:由于涉及到读写外部存储和网络...

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

    在Android应用开发中,文件上传是一项常见的功能,通常用于向服务器发送用户生成的数据,如图片、音频或视频。本教程将详细介绍如何通过HTTP协议在Android客户端实现文件上传,并在服务器端使用Servlet进行处理。 ...

    android客户端上传文件到服务器端

    本示例提供了一个完整的Android客户端文件上传到服务器的Demo,服务器端使用了流行的Java Web容器Tomcat。以下是关于这个过程涉及的关键知识点的详细解释。 1. **Android客户端上传文件**:在Android应用中,我们...

    安卓文件下载上传解压相关-Android上传文件到.net服务器服务器使用webservice.rar

    一、Android文件上传 1. 文件选择:在Android中,你可以使用`Intent.ACTION_GET_CONTENT`来启动系统文件选择器,让用户选择要上传的文件。 2. 文件读取:使用`java.io.File`类获取文件路径,然后用`java.io....

    android本地文件上传至服务器

    实现:将android文件通过服务端上传至服务器; 获取android本地文件,通过调用服务端后台代码进行文件上传。 只需要分别调用移动端uploadMultiFile()方法和服务端upload()方法。

    安卓文件下载上传解压相关-安卓上传照片到nodejs服务器.rar

    以上就是安卓文件上传、下载、解压涉及的主要知识点。实际开发中,还需要考虑错误处理、网络状态、安全性等问题,确保用户体验流畅且数据安全。对于描述中提到的"部分代码功能进行参考学习",建议结合具体代码理解每...

    delphi做的文件上传下载服务器端

    4. **文件上传机制**:文件上传通常涉及将文件分割成多个数据块,然后通过网络发送到服务器。服务器需要接收这些数据块,重组为原始文件,并保存到硬盘上。同时,需要处理错误检测和恢复,以确保文件完整无损。 5. ...

    Android上传文件到服务器

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

    android通过HTTP协议上传文件至远程服务器

    在Android开发中,将文件上传到远程服务器是常见的任务,特别是在移动应用中处理用户数据、图片或音频文件时。本文将详细讲解如何使用HTTP协议在Android客户端实现文件上传,并涉及服务器端的相关设置。 首先,我们...

    Android端上传文件的jar包

    在Android应用开发中,文件上传是一项常见的功能,例如用户可能需要上传照片、文档或音频到服务器进行存储或分享。为了实现这一功能,开发者通常会利用HTTP协议或者更现代的HTTPS协议,通过网络请求库(如Volley、...

    Android 上传文件到c# webservice

    在Android应用开发中,有时需要将本地文件上传到服务器,以实现数据同步或者备份功能。在本场景中,我们讨论的是如何将Android设备上的文件上传到由C#编写的Web服务(WebService)。以下是对这个过程的详细解释: 1...

    安卓Andriod源码——录音上传到服务器,上传使用AsyncTask异步任务.zip

    在Android开发中,将录音文件上传到服务器是一项常见的任务,特别是在构建涉及音频交互的应用时。这个压缩包"安卓Andriod源码——录音上传到服务器,上传使用AsyncTask异步任务.zip"提供了一个实例,展示了如何实现...

    android上传文件至服务器提供客户端下载

    在Android平台上,将文件上传至服务器并为其他客户端提供下载是一项常见的任务,尤其在移动应用开发中。这个过程涉及到客户端(Android设备)与服务器之间的数据交互,通常通过HTTP或HTTPS协议进行。本教程将深入...

Global site tag (gtag.js) - Google Analytics