android中使用HTTP协议和TCP协议实现上传文件
16lz
2021-01-23
android服务器端上传方法: package cn.test.web.servlet; import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) try { FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request); File dir = new File(request.getSession().getServletContext().getRealPath("/WEB-INF/upload")); //创建目录 dir.mkdir(); for (FileItem item : items) if (item.isFormField()) System.out.println(item.getFieldName() + ": " + item.getString()); else{ item.write(new File(dir,item.getName().substring(item.getName().lastIndexOf("\\")+1))); } } catch (Exception e) { e.printStackTrace(); } else { System.out.println(request.getMethod()); System.out.println(request.getParameter("username")); System.out.println(request.getParameter("password")); } } }
android客户器端上传方法:首先,要有一个javaBean类FormFile封装文件的信息:public class FormFile {/* 上传文件的数据 */private byte[] data;/* 文件名称 */private String filname;/* 表单字段名称*/private String formname;/* 内容类型 */private String contentType = "application/octet-stream"; //需要查阅相关的资料public FormFile(String filname, byte[] data, String formname, String contentType) { this.data = data; this.filname = filname; this.formname = formname; if(contentType!=null) this.contentType = contentType;}public byte[] getData() { return data;}public void setData(byte[] data) { this.data = data;}public String getFilname() { return filname;}public void setFilname(String filname) { this.filname = filname;}public String getFormname() { return formname;}public void setFormname(String formname) { this.formname = formname;}public String getContentType() { return contentType;}public void setContentType(String contentType) { this.contentType = contentType;}}实现文件上传的代码如下:/*** 直接通过HTTP协议提交数据到服务器,实现表单提交功能* @param actionUrl 上传路径* @param params 请求参数 key为参数名,value为参数值* @param file 上传文件*/public static String post(String actionUrl, Map<String, String> params, FormFile[] files) { try { String BOUNDARY = “———7d4a6d158c9″; //数据分隔线 String MULTIPART_FORM_DATA = “multipart/form-data”; URL url = new URL(actionUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true);//允许输入 conn.setDoOutput(true);//允许输出 conn.setUseCaches(false);//不使用Cache conn.setRequestMethod(”POST”); conn.setRequestProperty(”Connection”, “Keep-Alive”); conn.setRequestProperty(”Charset”, “UTF-8″); conn.setRequestProperty(”Content-Type”, MULTIPART_FORM_DATA + “; boundary=” + BOUNDARY); StringBuilder sb = new StringBuilder(); //上传的表单参数部分,格式请参考文章 for (Map.Entry<String, String> entry : params.entrySet()) {//构建表单字段内容 sb.append(”–”); sb.append(BOUNDARY); sb.append(”\r\n”); sb.append(”Content-Disposition: form-data; name=\”"+ entry.getKey() + “\”\r\n\r\n”); sb.append(entry.getValue()); sb.append(”\r\n”); } DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); outStream.write(sb.toString().getBytes());//发送表单字段数据 //上传的文件部分,格式请参考文章 for(FormFile file : files){ StringBuilder split = new StringBuilder(); split.append(”–”); split.append(BOUNDARY); split.append(”\r\n”); split.append(”Content-Disposition: form-data;name=\”"+ file.getFormname()+”\”;filename=\”"+ file.getFilname() + “\”\r\n”); split.append(”Content-Type: “+ file.getContentType()+”\r\n\r\n”); outStream.write(split.toString().getBytes()); outStream.write(file.getData(), 0, file.getData().length); outStream.write(”\r\n”.getBytes()); } byte[] end_data = (”–” + BOUNDARY + “–\r\n”).getBytes();//数据结束标志 outStream.write(end_data); outStream.flush(); int cah = conn.getResponseCode(); if (cah != 200) throw new RuntimeException(”请求url失败”); InputStream is = conn.getInputStream(); int ch; StringBuilder b = new StringBuilder(); while( (ch = is.read()) != -1 ){ b.append((char)ch); } outStream.close(); conn.disconnect(); return b.toString(); } catch (Exception e) { throw new RuntimeException(e); } }
更多相关文章
- Android使用SQLiteDatabase直接存取数据与图像
- android 数据库操作 GreenDAO 第三方开源项目
- android 使用Okhttp封装上传JSON格式数据的工具类
- Android 数据库 短信 监听
- android中常见的二种数据解析方法----XML和Json
- Android 复习笔记之图解ContentProvider实现数据共享
- Android 继承SQLiteOpenHelper自定义DBHelper存取数据与图像
- android 网络异步加载数据进度条
- android调用系统相机并调整照片大小保存,最后上传照片