客户端为:android:uploadDataToWeb

服务端为:servlet:videoWeb 服务器端的jsp页面如下: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form method="post" action="http://192.168.40.99:80/videoweb/video/manage.do" enctype="multipart/form-data"> 视频名称:<input type="text" name="title"><br/> 时长:<input type="text" name="timelength"><br/> <input type="file" name="video"/> <input type="hidden" name="method" value="save"/> <input type="submit" value="提交"/> </form> </body> </html> FormFile类作为数据的封装类,是一个javabean,代码如下: /** * 上传文件,封装数据用的 */ public class FormFile { /* 上传文件的数据 */ /*-----------------------------7dc17181501ce Content-Disposition: form-data; name="video"; filename="1279011770335.jpg" Content-Type: image/pjpeg*/ /* 请求参数名称*/ private byte[] data;//文件数据 private InputStream inStream; private File file;//上传的文件1279011770335.jpg /* 文件名称 */ private String filname;//filename其实文件名称可以从file获取到 private String parameterName;//video /* 内容类型 */ private String contentType = "application/octet-stream"; //2个构造器 //上传小文件 public FormFile(String filname, byte[] data, String parameterName, String contentType) { this.data = data; this.filname = filname; this.parameterName = parameterName; if(contentType!=null) this.contentType = contentType; } //上传大文件,一边读数据一边上传,避免内存溢出 public FormFile(String filname, File file, String parameterName, String contentType) { this.filname = filname; this.parameterName = parameterName; this.file = file; try { this.inStream = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } if(contentType!=null) this.contentType = contentType; } public File getFile() { return file; } public InputStream getInStream() { return inStream; } public byte[] getData() { return data; } public String getFilname() { return filname; } public void setFilname(String filname) { this.filname = filname; } public String getParameterName() { return parameterName; } public void setParameterName(String parameterName) { this.parameterName = parameterName; } public String getContentType() { return contentType; } public void setContentType(String contentType) { this.contentType = contentType; } } SocketHttpRequester类里面包装了核心的上传的代码: /** * 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能: * <FORM METHOD=POST ACTION="http://192.168.0.200:8080/ssi/fileload/test.do" enctype="multipart/form-data"> <INPUT TYPE="text" NAME="name"> <INPUT TYPE="text" NAME="id"> <input type="file" name="imagefile"/> <input type="file" name="zip"/> </FORM> * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试) * @param params 请求参数 key为参数名,value为参数值 * @param file 上传文件 */ public static boolean post(String path, Map<String, String> params, FormFile[] files) throws Exception{ final String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线 final String endline = "--" + BOUNDARY + "--\r\n";//数据结束标志 int fileDataLength = 0; for(FormFile uploadFile : files){//得到文件类型数据的总长度 StringBuilder fileExplain = new StringBuilder(); fileExplain.append("--"); fileExplain.append(BOUNDARY); fileExplain.append("\r\n"); fileExplain.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n"); fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n"); fileExplain.append("\r\n"); fileDataLength += fileExplain.length(); if(uploadFile.getInStream()!=null){ fileDataLength += uploadFile.getFile().length(); }else{ fileDataLength += uploadFile.getData().length; } } StringBuilder textEntity = new StringBuilder(); for (Map.Entry<String, String> entry : params.entrySet()) {//构造文本类型参数的实体数据 textEntity.append("--"); textEntity.append(BOUNDARY); textEntity.append("\r\n"); // \"为转义字符“ textEntity.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n"); textEntity.append(entry.getValue()); textEntity.append("\r\n"); } //计算传输给服务器的实体数据总长度 int dataLength = textEntity.toString().getBytes().length + fileDataLength + endline.getBytes().length; //重点 System.out.println("数据总长度为------------dataLength: "+dataLength); URL url = new URL(path); int port = url.getPort()==-1 ? 80 : url.getPort(); Socket socket = new Socket(InetAddress.getByName(url.getHost()), port); OutputStream outStream = socket.getOutputStream(); //下面完成HTTP请求头的发送 String requestmethod = "POST "+ url.getPath()+" HTTP/1.1\r\n"; outStream.write(requestmethod.getBytes()); String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n"; outStream.write(accept.getBytes()); String language = "Accept-Language: zh-CN\r\n"; outStream.write(language.getBytes()); String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "\r\n"; outStream.write(contenttype.getBytes()); String contentlength = "Content-Length: "+ dataLength + "\r\n"; outStream.write(contentlength.getBytes()); String alive = "Connection: Keep-Alive\r\n"; outStream.write(alive.getBytes()); String host = "Host: "+ url.getHost() +":"+ port +"\r\n"; outStream.write(host.getBytes()); //写完HTTP请求头后根据HTTP协议再写一个回车换行 outStream.write("\r\n".getBytes()); //把所有文本类型的实体数据发送出来 outStream.write(textEntity.toString().getBytes()); //把所有文件类型的实体数据发送出来 for(FormFile uploadFile : files){ StringBuilder fileEntity = new StringBuilder(); fileEntity.append("--"); fileEntity.append(BOUNDARY); fileEntity.append("\r\n"); fileEntity.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n"); fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n"); outStream.write(fileEntity.toString().getBytes()); if(uploadFile.getInStream()!=null){ byte[] buffer = new byte[1024]; int len = 0; while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){ outStream.write(buffer, 0, len); } uploadFile.getInStream().close(); }else{ outStream.write(uploadFile.getData(), 0, uploadFile.getData().length); } outStream.write("\r\n".getBytes()); } //下面发送数据结束标志,表示数据已经结束 outStream.write(endline.getBytes()); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败 return false; } outStream.flush(); outStream.close(); reader.close(); socket.close(); return true; } android的MainActivity页面: public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private EditText timelengthText; private EditText titleText; private EditText videoText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button = (Button) this.findViewById(R.id.button); timelengthText = (EditText) this.findViewById(R.id.timelength); videoText = (EditText) this.findViewById(R.id.video); titleText = (EditText) this.findViewById(R.id.title); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String title = titleText.getText().toString(); String timelength = timelengthText.getText().toString(); Map<String, String> params = new HashMap<String, String>(); params.put("method", "save"); params.put("title", title); params.put("timelength", timelength); try { // HttpRequest.sendGetRequest("http://192.168.1.100:8080/videoweb/video/manage.do", params, "UTF-8"); File uploadFile = new File(Environment.getExternalStorageDirectory(), videoText.getText().toString()); FormFile formfile = new FormFile(title, uploadFile, "video", "audio/mpeg"); SocketHttpRequester.post("http://192.168.40.99:80/videoweb/video/manage.do", params, formfile); Toast.makeText(MainActivity.this, R.string.success, 1).show(); } catch (Exception e) { Toast.makeText(MainActivity.this, R.string.error, 1).show(); Log.e(TAG, e.toString()); } } }); } }

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. 一起学android之SimpleAdapter使用(13)
  5. Android如何通过scheme跳转界面
  6. 使用x5cloud云平台来做网络彩讯-------------好友列表(六)
  7. Android学习笔记:Activity-Spinner
  8. 几个Android常见wraning警告处理方法
  9. android中经常用到的 ExpandableListView 的简单使用

随机推荐

  1. androidRSA加密,java解密出现错误或者乱码
  2. Android设备的界面适配设计
  3. Android(安卓)高质量开发之崩溃优化
  4. android MultiDex multidex原理原理下遇
  5. 关于android内存泄漏的研究
  6. android 手动分包,将指定class打包到主dex
  7. Android(安卓)直接显示yuv数据 通过Aweso
  8. android 实现一个按钮按下时总触发一个事
  9. Android(安卓)应用和系统优化V1.2
  10. 史上最全的Android常规知识点面试题集锦