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

Servlet实现文件上传的三种方法总结

程序员文章站 2022-06-29 13:23:17
servlet实现文件上传的三种方法总结 1. 通过getinputstream()取得上传文件。 /** * to change this temp...

servlet实现文件上传的三种方法总结

1. 通过getinputstream()取得上传文件。

/** 
 * to change this template, choose tools | templates 
 * and open the template in the editor. 
 */ 
package net.individuals.web.servlet; 
 
import java.io.datainputstream; 
import java.io.fileoutputstream; 
import java.io.ioexception; 
import javax.servlet.servletexception; 
import javax.servlet.annotation.webservlet; 
import javax.servlet.http.httpservlet; 
import javax.servlet.http.httpservletrequest; 
import javax.servlet.http.httpservletresponse; 
 
/** 
 * 
 * @author barudisshu 
 */ 
@webservlet(name = "uploadservlet", urlpatterns = {"/uploadservlet"}) 
public class uploadservlet extends httpservlet { 
 
  /** 
   * processes requests for both http 
   * <code>get</code> and 
   * <code>post</code> methods. 
   * 
   * @param request servlet request 
   * @param response servlet response 
   * @throws servletexception if a servlet-specific error occurs 
   * @throws ioexception if an i/o error occurs 
   */ 
  protected void processrequest(httpservletrequest request, httpservletresponse response) 
      throws servletexception, ioexception { 
    response.setcontenttype("text/html;charset=utf-8"); 
    //读取请求body 
    byte[] body = readbody(request); 
    //取得所有body内容的字符串表示 
    string textbody = new string(body, "iso-8859-1"); 
    //取得上传的文件名称 
    string filename = getfilename(textbody); 
    //取得文件开始与结束位置 
    position p = getfileposition(request, textbody); 
    //输出至文件 
    writeto(filename, body, p); 
  } 
 
  //构造类 
  class position { 
 
    int begin; 
    int end; 
 
    public position(int begin, int end) { 
      this.begin = begin; 
      this.end = end; 
    } 
  } 
 
  private byte[] readbody(httpservletrequest request) throws ioexception { 
    //获取请求文本字节长度 
    int formdatalength = request.getcontentlength(); 
    //取得servletinputstream输入流对象 
    datainputstream datastream = new datainputstream(request.getinputstream()); 
    byte body[] = new byte[formdatalength]; 
    int totalbytes = 0; 
    while (totalbytes < formdatalength) { 
      int bytes = datastream.read(body, totalbytes, formdatalength); 
      totalbytes += bytes; 
    } 
    return body; 
  } 
 
  private position getfileposition(httpservletrequest request, string textbody) throws ioexception { 
    //取得文件区段边界信息 
    string contenttype = request.getcontenttype(); 
    string boundarytext = contenttype.substring(contenttype.lastindexof("=") + 1, contenttype.length()); 
    //取得实际上传文件的气势与结束位置 
    int pos = textbody.indexof("filename=\""); 
    pos = textbody.indexof("\n", pos) + 1; 
    pos = textbody.indexof("\n", pos) + 1; 
    pos = textbody.indexof("\n", pos) + 1; 
    int boundaryloc = textbody.indexof(boundarytext, pos) - 4; 
    int begin = ((textbody.substring(0, pos)).getbytes("iso-8859-1")).length; 
    int end = ((textbody.substring(0, boundaryloc)).getbytes("iso-8859-1")).length; 
 
    return new position(begin, end); 
  } 
 
  private string getfilename(string requestbody) { 
    string filename = requestbody.substring(requestbody.indexof("filename=\"") + 10); 
    filename = filename.substring(0, filename.indexof("\n")); 
    filename = filename.substring(filename.indexof("\n") + 1, filename.indexof("\"")); 
 
    return filename; 
  } 
 
  private void writeto(string filename, byte[] body, position p) throws ioexception { 
    fileoutputstream fileoutputstream = new fileoutputstream("e:/workspace/" + filename); 
    fileoutputstream.write(body, p.begin, (p.end - p.begin)); 
    fileoutputstream.flush(); 
    fileoutputstream.close(); 
  } 
 
  // <editor-fold defaultstate="collapsed" desc="httpservlet methods. click on the + sign on the left to edit the code."> 
  /** 
   * handles the http 
   * <code>get</code> method. 
   * 
   * @param request servlet request 
   * @param response servlet response 
   * @throws servletexception if a servlet-specific error occurs 
   * @throws ioexception if an i/o error occurs 
   */ 
  @override 
  protected void doget(httpservletrequest request, httpservletresponse response) 
      throws servletexception, ioexception { 
    processrequest(request, response); 
  } 
 
  /** 
   * handles the http 
   * <code>post</code> method. 
   * 
   * @param request servlet request 
   * @param response servlet response 
   * @throws servletexception if a servlet-specific error occurs 
   * @throws ioexception if an i/o error occurs 
   */ 
  @override 
  protected void dopost(httpservletrequest request, httpservletresponse response) 
      throws servletexception, ioexception { 
    processrequest(request, response); 
  } 
 
  /** 
   * returns a short description of the servlet. 
   * 
   * @return a string containing servlet description 
   */ 
  @override 
  public string getservletinfo() { 
    return "short description"; 
  }// </editor-fold> 
} 

 2. 通过getpart()、getparts()取得上传文件。

    body格式:

post http://www.example.com http/1.1  
content-type:multipart/form-data; boundary=----webkitformboundaryrgkcby7qhfd3trwa  
 
------webkitformboundaryrgkcby7qhfd3trwa  
content-disposition: form-data; name="text"  
 
title  
------webkitformboundaryrgkcby7qhfd3trwa  
content-disposition: form-data; name="file"; filename="chrome.png"  
content-type: image/png  
 
png ... content of chrome.png ...  
------webkitformboundaryrgkcby7qhfd3trwa--  

 

[html] view plain copy
/** 
 * to change this template, choose tools | templates 
 * and open the template in the editor. 
 */ 
package net.individuals.web.servlet; 
 
import java.io.filenotfoundexception; 
import java.io.fileoutputstream; 
import java.io.ioexception; 
import java.io.inputstream; 
import java.io.outputstream; 
import javax.servlet.servletexception; 
import javax.servlet.annotation.multipartconfig; 
import javax.servlet.annotation.webservlet; 
import javax.servlet.http.httpservlet; 
import javax.servlet.http.httpservletrequest; 
import javax.servlet.http.httpservletresponse; 
import javax.servlet.http.part; 
 
/** 
 * 
 * @author barudisshu 
 */ 
@multipartconfig 
@webservlet(name = "uploadservlet", urlpatterns = {"/uploadservlet"}) 
public class uploadservlet extends httpservlet { 
 
  /** 
   * processes requests for both http 
   * <code>get</code> and 
   * <code>post</code> methods. 
   * 
   * @param request servlet request 
   * @param response servlet response 
   * @throws servletexception if a servlet-specific error occurs 
   * @throws ioexception if an i/o error occurs 
   */ 
  protected void processrequest(httpservletrequest request, httpservletresponse response) 
      throws servletexception, ioexception { 
    part part = request.getpart("photo"); 
    string filename = getfilename(part); 
    writeto(filename, part); 
  } 
 
  //取得上传文件名 
  private string getfilename(part part) { 
    string header = part.getheader("content-disposition"); 
    string filename = header.substring(header.indexof("filename=\"") + 10, header.lastindexof("\"")); 
 
    return filename; 
  } 
 
  //存储文件 
  private void writeto(string filename, part part) throws ioexception, filenotfoundexception { 
    inputstream in = part.getinputstream(); 
    outputstream out = new fileoutputstream("e:/workspace/" + filename); 
    byte[] buffer = new byte[1024]; 
    int length = -1; 
    while ((length = in.read(buffer)) != -1) { 
      out.write(buffer, 0, length); 
    } 
 
    in.close(); 
    out.close(); 
  } 
 
  // <editor-fold defaultstate="collapsed" desc="httpservlet methods. click on the + sign on the left to edit the code."> 
  /** 
   * handles the http 
   * <code>get</code> method. 
   * 
   * @param request servlet request 
   * @param response servlet response 
   * @throws servletexception if a servlet-specific error occurs 
   * @throws ioexception if an i/o error occurs 
   */ 
  @override 
  protected void doget(httpservletrequest request, httpservletresponse response) 
      throws servletexception, ioexception { 
    processrequest(request, response); 
  } 
 
  /** 
   * handles the http 
   * <code>post</code> method. 
   * 
   * @param request servlet request 
   * @param response servlet response 
   * @throws servletexception if a servlet-specific error occurs 
   * @throws ioexception if an i/o error occurs 
   */ 
  @override 
  protected void dopost(httpservletrequest request, httpservletresponse response) 
      throws servletexception, ioexception { 
    processrequest(request, response); 
  } 
 
  /** 
   * returns a short description of the servlet. 
   * 
   * @return a string containing servlet description 
   */ 
  @override 
  public string getservletinfo() { 
    return "short description"; 
  } 
} 

3、另一种较为简单的方法:采用part的wirte(string filename)上传,浏览器将产生临时tmp文件

/** 
 * to change this template, choose tools | templates 
 * and open the template in the editor. 
 */ 
package net.individuals.web.servlet; 
 
import java.io.ioexception; 
import java.io.printwriter; 
import javax.servlet.servletexception; 
import javax.servlet.annotation.multipartconfig; 
import javax.servlet.annotation.webservlet; 
import javax.servlet.http.httpservlet; 
import javax.servlet.http.httpservletrequest; 
import javax.servlet.http.httpservletresponse; 
import javax.servlet.http.part; 
 
/** 
 *采用part的wirte(string filename)上传,浏览器将产生临时tmp文件。 
 * @author barudisshu 
 */ 
@multipartconfig(location = "e:/workspace") 
@webservlet(name = "uploadservlet", urlpatterns = {"/uploadservlet"}) 
public class uploadservlet extends httpservlet { 
 
  /** 
   * processes requests for both http 
   * <code>get</code> and 
   * <code>post</code> methods. 
   * 
   * @param request servlet request 
   * @param response servlet response 
   * @throws servletexception if a servlet-specific error occurs 
   * @throws ioexception if an i/o error occurs 
   */ 
  protected void processrequest(httpservletrequest request, httpservletresponse response) 
      throws servletexception, ioexception { 
    //处理中文文件名 
    request.setcharacterencoding("utf-8"); 
    part part = request.getpart("photo"); 
    string filename = getfilename(part); 
    //将文件写入location指定的目录 
    part.write(filename); 
  } 
 
  private string getfilename(part part) { 
    string header = part.getheader("content-disposition"); 
    string filename = header.substring(header.indexof("filename=\"") + 10, header.lastindexof("\"")); 
    return filename; 
  } 
 
  // <editor-fold defaultstate="collapsed" desc="httpservlet methods. click on the + sign on the left to edit the code."> 
  /** 
   * handles the http 
   * <code>get</code> method. 
   * 
   * @param request servlet request 
   * @param response servlet response 
   * @throws servletexception if a servlet-specific error occurs 
   * @throws ioexception if an i/o error occurs 
   */ 
  @override 
  protected void doget(httpservletrequest request, httpservletresponse response) 
      throws servletexception, ioexception { 
    processrequest(request, response); 
  } 
 
  /** 
   * handles the http 
   * <code>post</code> method. 
   * 
   * @param request servlet request 
   * @param response servlet response 
   * @throws servletexception if a servlet-specific error occurs 
   * @throws ioexception if an i/o error occurs 
   */ 
  @override 
  protected void dopost(httpservletrequest request, httpservletresponse response) 
      throws servletexception, ioexception { 
    processrequest(request, response); 
  } 
 
  /** 
   * returns a short description of the servlet. 
   * 
   * @return a string containing servlet description 
   */ 
  @override 
  public string getservletinfo() { 
    return "short description"; 
  }// </editor-fold> 
} 

以上就是servlet实现文件上传的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!