欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android编程使用HTTP协议与TCP协议实现上传文件的方法

程序员文章站 2023-12-20 17:32:34
本文实例讲述了android编程使用http协议与tcp协议实现上传文件的方法。分享给大家供大家参考,具体如下: android上传文件有两种方式,第一种是基于http协...

本文实例讲述了android编程使用http协议与tcp协议实现上传文件的方法。分享给大家供大家参考,具体如下:

android上传文件有两种方式,第一种是基于http协议的httpurlconnection,第二种是基于tcp协议的socket。 这两种方式的区别是使用httpurlconnection上传时内部有缓存机制,如果上传较大文件会导致内存溢出。如果用tcp协议socket方式上传就会解决这种弊端。

http协议httpurlconnection

1. 通过url封装路径打开一个httpurlconnection
2.设置请求方式以及头字段:content-type、content-length、host
3.拼接数据发送

示例:

private static final string boundary = "---------------------------7db1c523809b2";//数据分割线
public boolean uploadhttpurlconnection(string username, string password, string path) throws exception {
  //找到sdcard上的文件
  file file = new file(environment.getexternalstoragedirectory(), path);
  //仿http协议发送数据方式进行拼接
  stringbuilder sb = new stringbuilder();
  sb.append("--" + boundary + "\r\n");
  sb.append("content-disposition: form-data; name=\"username\"" + "\r\n");
  sb.append("\r\n");
  sb.append(username + "\r\n");
  sb.append("--" + boundary + "\r\n");
  sb.append("content-disposition: form-data; name=\"password\"" + "\r\n");
  sb.append("\r\n");
  sb.append(password + "\r\n");
  sb.append("--" + boundary + "\r\n");
  sb.append("content-disposition: form-data; name=\"file\"; filename=\"" + path + "\"" + "\r\n");
  sb.append("content-type: image/pjpeg" + "\r\n");
  sb.append("\r\n");
  byte[] before = sb.tostring().getbytes("utf-8");
  byte[] after = ("\r\n--" + boundary + "--\r\n").getbytes("utf-8");
  url url = new url("http://192.168.1.16:8080/14_web/servlet/loginservlet");
  httpurlconnection conn = (httpurlconnection) url.openconnection();
  conn.setrequestmethod("post");
  conn.setrequestproperty("content-type", "multipart/form-data; boundary=" + boundary);
  conn.setrequestproperty("content-length", string.valueof(before.length + file.length() + after.length));
  conn.setrequestproperty("host", "192.168.1.16:8080");
  conn.setdooutput(true);
  outputstream out = conn.getoutputstream();
  inputstream in = new fileinputstream(file);
  out.write(before);
  byte[] buf = new byte[1024];
  int len;
  while ((len = in.read(buf)) != -1)
    out.write(buf, 0, len);
  out.write(after);
  in.close();
  out.close();
  return conn.getresponsecode() == 200;
}

tcp协议socket

1.我们可以使用socket发送tcp请求,将上传数据分段发送

示例:

public boolean uploadbysocket(string username, string password, string path) throws exception {
  // 根据path找到sdcard中的文件
  file file = new file(environment.getexternalstoragedirectory(), path);
  // 组装表单字段和文件之前的数据
  stringbuilder sb = new stringbuilder();
  sb.append("--" + boundary + "\r\n");
  sb.append("content-disposition: form-data; name=\"username\"" + "\r\n");
  sb.append("\r\n");
  sb.append(username + "\r\n");
  sb.append("--" + boundary + "\r\n");
  sb.append("content-disposition: form-data; name=\"password\"" + "\r\n");
  sb.append("\r\n");
  sb.append(password + "\r\n");
  sb.append("--" + boundary + "\r\n");
  sb.append("content-disposition: form-data; name=\"file\"; filename=\"" + path + "\"" + "\r\n");
  sb.append("content-type: image/pjpeg" + "\r\n");
  sb.append("\r\n");
  // 文件之前的数据
  byte[] before = sb.tostring().getbytes("utf-8");
  // 文件之后的数据
  byte[] after = ("\r\n--" + boundary + "--\r\n").getbytes("utf-8");
  url url = new url("http://192.168.1.199:8080/14_web/servlet/loginservlet");
  // 由于httpurlconnection中会缓存数据, 上传较大文件时会导致内存溢出, 所以我们使用socket传输
  socket socket = new socket(url.gethost(), url.getport());
  outputstream out = socket.getoutputstream();
  printstream ps = new printstream(out, true, "utf-8");
  // 写出请求头
  ps.println("post /14_web/servlet/loginservlet http/1.1");
  ps.println("content-type: multipart/form-data; boundary=" + boundary);
  ps.println("content-length: " + string.valueof(before.length + file.length() + after.length));
  ps.println("host: 192.168.1.199:8080");
  inputstream in = new fileinputstream(file);
  // 写出数据
  out.write(before);
  byte[] buf = new byte[1024];
  int len;
  while ((len = in.read(buf)) != -1)
    out.write(buf, 0, len);
  out.write(after);
  in.close();
  out.close();
  return true;
}

搭建服务器,完成上传功能

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程序设计有所帮助。

上一篇:

下一篇: