Android上传文件到服务器

分类: android 网络编程 android2012-09-07 23:53 12656人阅读 评论(4) 收藏 举报

androidbuffernullfilejava

Android要实现文件上传,可以利用Socket上传,也可以模拟Web进行上传,但是如果是使用第一种方式上传,严格的话就得使用TCP,这样容易生成系统死掉,或者是长时间等待,如果是UDP来传,就容易造成数据丢失,因此在这里选择了Web进行上传,使用Web进行上传是模拟的Http Post上传数据,当然,Post上传数据的类,在网上找了一找,方式虽然很多,但是没有一个感觉是我所使用的,所以参照原理之类的,进行了一下修改,算是做了一个参考。并且利用这个类完成了文件和表彰的上传服务。

上传方法一:

[java] view plaincopy

  1. public void uploadFile(){
  2. String name=URLEncoder.encode(text1.getText().toString(),"utf-8");
  3. String pass=URLEncoder.encode(text2.getText().toString(),"utf-8");
  4. Map<String, String> params = new HashMap<String, String>();
  5. params.put("NAME", name);
  6. params.put("PASSWORD", pass);
  7. post("http://192.168.1.120/dev/index.php/Device/UploadFile?filename=111&filetype=IMAGE", params, upfiles);
  8. }
  9. Map<String, File> upfiles = new HashMap<String, File>();
  10. void getFile() {
  11. File file = new File("/sdcard/");
  12. File[] files = file.listFiles(new fileFilter());
  13. for (File f: files) {
  14. upfiles.put(f.getName(), new File("/sdcard/"+f.getName()));
  15. }
  16. //  Toast.makeText(this, filename, Toast.LENGTH_LONG).show();
  17. }
  18. class fileFilter implements FilenameFilter {
  19. @Override
  20. public boolean accept(File dir, String filename) {
  21. return filename.endsWith(".mp3");
  22. }
  23. }
  24. // 上传代码,第一个参数,为要使用的URL,第二个参数,为表单内容,第三个参数为要上传的文件,可以上传多个文件,这根据需要页定
  25. public static boolean post(String actionUrl,Map<String, String> params,Map<String, File> files) throws IOException {
  26. String BOUNDARY = java.util.UUID.randomUUID().toString();
  27. String PREFIX = "--", LINEND = "\r\n";
  28. String MULTIPART_FROM_DATA = "multipart/form-data";
  29. String CHARSET = "UTF-8";
  30. URL uri = new URL(actionUrl);
  31. HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
  32. conn.setReadTimeout(5 * 1000);
  33. conn.setDoInput(true);// 允许输入
  34. conn.setDoOutput(true);// 允许输出
  35. conn.setUseCaches(false);
  36. conn.setRequestMethod("POST"); // Post方式
  37. conn.setRequestProperty("connection", "keep-alive");
  38. conn.setRequestProperty("Charsert", "UTF-8");
  39. conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA
  40. + ";boundary=" + BOUNDARY);
  41. // 首先组拼文本类型的参数
  42. StringBuilder sb = new StringBuilder();
  43. for (Map.Entry<String, String> entry : params.entrySet()) {
  44. sb.append(PREFIX);
  45. sb.append(BOUNDARY);
  46. sb.append(LINEND);
  47. sb.append("Content-Disposition: form-data; name=\""
  48. + entry.getKey() + "\"" + LINEND);
  49. sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
  50. sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
  51. sb.append(LINEND);
  52. sb.append(entry.getValue());
  53. sb.append(LINEND);
  54. }
  55. DataOutputStream outStream = new DataOutputStream(
  56. conn.getOutputStream());
  57. outStream.write(sb.toString().getBytes());
  58. // 发送文件数据
  59. if (files != null)
  60. for (Map.Entry<String, File> file : files.entrySet()) {
  61. StringBuilder sb1 = new StringBuilder();
  62. sb1.append(PREFIX);
  63. sb1.append(BOUNDARY);
  64. sb1.append(LINEND);
  65. sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\""
  66. + file.getKey() + "\"" + LINEND);
  67. sb1.append("Content-Type: multipart/form-data; charset="
  68. + CHARSET + LINEND);
  69. sb1.append(LINEND);
  70. outStream.write(sb1.toString().getBytes());
  71. InputStream is = new FileInputStream(file.getValue());
  72. byte[] buffer = new byte[1024];
  73. int len = 0;
  74. while ((len = is.read(buffer)) != -1) {
  75. outStream.write(buffer, 0, len);
  76. }
  77. is.close();
  78. outStream.write(LINEND.getBytes());
  79. }
  80. // 请求结束标志
  81. byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
  82. outStream.write(end_data);
  83. outStream.flush();
  84. // 得到响应码
  85. boolean success = conn.getResponseCode()==200;
  86. InputStream in = conn.getInputStream();
  87. InputStreamReader isReader = new InputStreamReader(in);
  88. BufferedReader bufReader = new BufferedReader(isReader);
  89. String line = null;
  90. String data = "getResult=";
  91. while ((line = bufReader.readLine()) != null)
  92. data += line;
  93. outStream.close();
  94. conn.disconnect();
  95. return success;
  96. }

上传方法二;

[java] view plaincopy

  1. final String ENCORDING="UTF-8";
  2. public boolean upload(String filepath) throws Exception {
  3. String boundary = "---------------------------7db1c523809b2";//+java.util.UUID.randomUUID().toString();//
  4. // 分割线
  5. File file = new File(filepath);
  6. String fileName=new String("哈哈嗨".getBytes(),"ISO-8859-1");
  7. // 用来解析主机名和端口
  8. URL url = new URL("http://192.168.1.120/dev/index.php/Device/UploadFile?filename="+fileName+"&filetype=IMAGE");
  9. // 用来开启连接
  10. StringBuilder sb = new StringBuilder();
  11. // 用来拼装请求
  12. /*// username字段
  13. sb.append("--" + boundary + "\r\n");
  14. sb.append("Content-Disposition: form-data; name=\"username\"" + "\r\n");
  15. sb.append("\r\n");
  16. sb.append(username + "\r\n");
  17. // password字段
  18. sb.append("--" + boundary + "\r\n");
  19. sb.append("Content-Disposition: form-data; name=\"password\"" + "\r\n");
  20. sb.append("\r\n");
  21. sb.append(password + "\r\n");*/
  22. // 文件部分
  23. sb.append("--" + boundary + "\r\n");
  24. sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + filepath + "\"" + "\r\n");
  25. sb.append("Content-Type: application/octet-stream" + "\r\n");
  26. sb.append("\r\n");
  27. // 将开头和结尾部分转为字节数组,因为设置Content-Type时长度是字节长度
  28. byte[] before = sb.toString().getBytes(ENCORDING);
  29. byte[] after = ("\r\n--" + boundary + "--\r\n").getBytes(ENCORDING);
  30. // 打开连接, 设置请求头
  31. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  32. conn.setConnectTimeout(10000);
  33. conn.setRequestMethod("POST");
  34. conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
  35. conn.setRequestProperty("Content-Length", before.length + file.length() + after.length + "");
  36. conn.setDoOutput(true);
  37. conn.setDoInput(true);
  38. // 获取输入输出流
  39. OutputStream out = conn.getOutputStream();
  40. FileInputStream fis = new FileInputStream(file);
  41. // 将开头部分写出
  42. out.write(before);
  43. // 写出文件数据
  44. byte[] buf = new byte[1024*5];
  45. int len;
  46. while ((len = fis.read(buf)) != -1)
  47. out.write(buf, 0, len);
  48. // 将结尾部分写出
  49. out.write(after);
  50. InputStream in = conn.getInputStream();
  51. InputStreamReader isReader = new InputStreamReader(in);
  52. BufferedReader bufReader = new BufferedReader(isReader);
  53. String line = null;
  54. String data = "getResult=";
  55. while ((line = bufReader.readLine()) != null)
  56. data += line;
  57. Log.e("fromServer", "result="+data);
  58. boolean sucess=conn.getResponseCode() == 200;
  59. in.close();
  60. fis.close();
  61. out.close();
  62. conn.disconnect();
  63. return sucess;
  64. }

通过此代码就可以实现将内容保存到SD卡等设备上,当然要使用网络,必须得有网络的访问权限。这个需要自己添加,在这里不再添加!

时间: 2024-08-05 11:11:57

Android上传文件到服务器的相关文章

【经验记录】Android上传文件到服务器

Android中实现上传文件,其实是很简单的,和在java里面是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要配置content-type的一些参数!如果这些都弄好了,上传就很简单了,下面是我写的一个上传的工具类: package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream;

Android上传文件到服务器(转)

Android中实现上传文件,其实是很简单的,和在java里面是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要配置content-type的一些参数!如果这些都弄好了,上传就很简单了,下面是我写的一个上传的工具类: package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream;

Android上传文件至服务器(转)

本实例实现每隔5秒上传一次,通过服务器端获取手机上传过来的文件信息并做相应处理:采用Android+Struts2技术. 一.Android端实现文件上传 1).新建一个Android项目命名为androidUpload,目录结构如下: 2).新建FormFile类,用来封装文件信息 package com.ljq.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExce

android 上传文件到服务器

Android客户端 package com.example.testandroid;   import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL;   import android.app.Activity; import android.app.Alert

android 上传文件

android对于上传文件,还是很简单的,和java里面的上传都是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要一些content-type这些参数的配置!  如果这些都弄好了,上传就很简单了!   下面是我写的一个上传的工具类: package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; import java.io.FileInput

Android中利用HTTP协议实现上传文件到服务器

首先我们需要使用HTTP协议发送数据,我们就要知道HTTP发送上传文件到服务器的时候需要哪些头字段已经相关的配置,请看下图 这是使用浏览器模拟上传文件到服务器时候所发送的请求,我们可以看到它包含了请求头字段和实体部分,但是多了一个---------------------------7da2137580612,它实际上是一条分隔线,用于分隔实体数据的,他在使用分隔实体数据的时候会在前面包含多两个"-"而在结束的时候会在除了在前面都出两个减号"-"之外,还会在末尾都出

android 上传文件&quot;Content-Type&quot;,为&quot;application/octet-stream&quot; 用php程序在服务端用$GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;]接受(二)

服务端php程序file_up.php function uploadFileBinary() { $this->initData(); $absoluteName = ""; $fid = ""; $handleWrite = null; if(!empty($GLOBALS['HTTP_RAW_POST_DATA']) && strlen($GLOBALS['HTTP_RAW_POST_DATA'])>0) { if(!empty($

Android上传文件之FTP

android客户端实现FTP文件(包括图片)上传应该没什么难度.写下来就了为了记录一下,望能帮到新手. 需要用到 commons-net-3.0.1.jar,后面附上jar包. 直接上代码: /**  * 通过ftp上传文件  * @param url ftp服务器地址 如: 192.168.1.110  * @param port 端口如 : 21  * @param username  登录名  * @param password   密码  * @param remotePath  上到

黑马程序员 【】java学习之路——TCP(三)客户端上传文件到服务器

------- <a href="http://www.itheima.com" target="blank">android培训</a>.<a href="http://www.itheima.com" target="blank">java培训</a>.期待与您交流! ---------- import java.io.*; import java.net.*; class