转:http://blog.csdn.net/explorerqp/article/details/7283295

最近在做一个android名片管理系统的demo,主要功能是与服务器端通信上传及下载数据。

android访问服务器端下载基本没什么问题,但是android上传到服务器遇到瓶颈。

android上传文件以数据流的形式上传,所以采用模拟http请求将文件以数据流的形式上传到服务器端,代码如下:

[java] view plain copy print ?
  1. </pre><prename="code"class="java">importjava.io.BufferedReader;
  2. importjava.io.DataOutputStream;
  3. importjava.io.File;
  4. importjava.io.FileInputStream;
  5. importjava.io.InputStream;
  6. importjava.io.InputStreamReader;
  7. importjava.net.HttpURLConnection;
  8. importjava.net.URL;
  9. importandroid.app.Activity;
  10. importandroid.os.Bundle;
  11. importandroid.os.Environment;
  12. importandroid.util.Log;
  13. importandroid.view.View;
  14. importandroid.widget.Button;
  15. importandroid.widget.TextView;
  16. importandroid.widget.Toast;
  17. publicclassmainActivityextendsActivity{
  18. /*
  19. *变量声明filename:上传后在服务器上的文件名称uploadFile:要上传的文件路径actionUrl:服务器上对应的程序路径
  20. */
  21. privateStringsrcPath=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"download"+
  22. File.separator+"tilocal.jpeg";
  23. privateStringnewName="tilocal.jpeg";
  24. //要上传的本地文件路径
  25. privateStringuploadFile=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"download"+
  26. File.separator+"tilocal.jpeg";
  27. //上传到服务器的指定位置(废弃,在uploadFile方法中写访问服务器路径)
  28. //privateStringactionUrl="http://192.168.3.10:8080//android/customer/upLoad.action";

[java] view plain copy print ?
  1. privateTextViewmTextView1;

[java] view plain copy print ?
  1. privateTextViewmTextView2;
  2. privateButtonmButton1;
  3. @Override
  4. publicvoidonCreate(BundlesavedInstanceState)
  5. {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.main);
  8. mTextView1=(TextView)findViewById(R.id.mTextView1);
  9. mTextView1.setText("FilePath:/n"+uploadFile);
  10. mTextView2=(TextView)findViewById(R.id.mTextView2);
  11. //mTextView2.setText("UploadPath:/n"+actionUrl);
  12. /*设定mButton的onClick事件处理*/
  13. mButton1=(Button)findViewById(R.id.mButton1);
  14. mButton1.setOnClickListener(newView.OnClickListener()
  15. {
  16. publicvoidonClick(Viewv)
  17. {
  18. uploadFile();
  19. }
  20. });
  21. }
  22. privatevoiduploadFile(){
  23. StringuploadUrl="http://10.0.2.2:8080/upLoadFile/servlet/UpLoadFile";
  24. Stringend="\r\n";
  25. StringtwoHyphens="--";
  26. Stringboundary="******";
  27. try{
  28. URLurl=newURL(uploadUrl);
  29. HttpURLConnectionhttpURLConnection=(HttpURLConnection)url.openConnection();
  30. httpURLConnection.setDoInput(true);
  31. httpURLConnection.setDoOutput(true);
  32. httpURLConnection.setUseCaches(false);
  33. httpURLConnection.setRequestMethod("POST");
  34. httpURLConnection.setRequestProperty("Connection","Keep-Alive");
  35. httpURLConnection.setRequestProperty("Charset","UTF-8");
  36. httpURLConnection.setRequestProperty("Content-Type","multipart/form-data;boundary="+boundary);
  37. DataOutputStreamdos=newDataOutputStream(httpURLConnection.getOutputStream());
  38. dos.writeBytes(twoHyphens+boundary+end);
  39. dos.writeBytes("Content-Disposition:form-data;name=\"file\";filename=\""
  40. +srcPath.substring(srcPath.lastIndexOf("/")+1)+"\""+end);
  41. dos.writeBytes(end);
  42. FileInputStreamfis=newFileInputStream(srcPath);
  43. byte[]buffer=newbyte[8192];//8k
  44. intcount=0;
  45. while((count=fis.read(buffer))!=-1){
  46. dos.write(buffer,0,count);
  47. }
  48. Log.e("",dos.size()+"----------");
  49. fis.close();
  50. dos.writeBytes(end);
  51. dos.writeBytes(twoHyphens+boundary+twoHyphens+end);
  52. dos.flush();
  53. InputStreamis=httpURLConnection.getInputStream();
  54. InputStreamReaderisr=newInputStreamReader(is,"utf-8");
  55. BufferedReaderbr=newBufferedReader(isr);
  56. Stringresult=br.readLine();
  57. Toast.makeText(this,result,Toast.LENGTH_LONG).show();
  58. dos.close();
  59. is.close();
  60. }catch(Exceptione){
  61. e.printStackTrace();
  62. setTitle(e.getMessage());
  63. }
  64. }
  65. }


以上代码为android模拟http协议上传文件,以数据流的形式上传。

下面为服务器端servlet接收代码:

[java] view plain copy print ?
  1. importjava.io.FileOutputStream;
  2. importjava.io.IOException;
  3. importjavax.servlet.ServletException;
  4. importjavax.servlet.ServletInputStream;
  5. importjavax.servlet.http.HttpServlet;
  6. importjavax.servlet.http.HttpServletRequest;
  7. importjavax.servlet.http.HttpServletResponse;

[java] view plain copy print ?

[java] view plain copy print ?

[java] view plain copy print ?
  1. publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
  2. throwsServletException,IOException{
  3. //获取输入流,是HTTP协议中的实体内容
  4. ServletInputStreamin=request.getInputStream();
  5. //缓冲区
  6. bytebuffer[]=newbyte[1024];
  7. //写入服务器端固定路径磁盘中
  8. FileOutputStreamout=newFileOutputStream("F:\\upload\\zzz.jpeg");
  9. intlen=in.read(buffer,0,1024);
  10. //把流里的信息循环读入到file文件中
  11. System.out.println(len+"+++++++++++++");
  12. while(len!=-1){
  13. System.out.println(len+"----------");
  14. out.write(buffer,0,len);
  15. len=in.readLine(buffer,0,1024);
  16. }
  17. out.close();
  18. in.close();
  19. }


以上代码为粗糙的实现了android客户端与服务器端文件的上传功能。

更多相关文章

  1. android访问服务器端上传及服务器端接收
  2. android上传图片至服务器
  3. Android studio生成APK打包,修改生成APK的路径和名字
  4. android SDK系统图片资源的路径。
  5. 2011.09.09 ——— android 2.2 修改安装路径
  6. 更改Android AVD模拟器创建路径位置的方法
  7. 面向UDP的Android——PC双向通信(二):实现Android客户端和PC服务器
  8. Android上传下载文件(图片)
  9. Android 存储路径浅析

随机推荐

  1. Android中使用PULL方式解析XML文件深入介
  2. Android学习笔记(29):搜索框SearchView
  3. Android(安卓)Rxjava+Retrofit网络请求框
  4. Android Lint gradle错误处理
  5. Android VNC Server
  6. Android用代码实现EditText不可编辑
  7. Android(安卓)实现ActionBar定制
  8. 解决导入Android例子时“Unable to resol
  9. android 打开预览不同类型文件
  10. Run c++ program with boost on Android