servlet处理文件上传8

来源:互联网 发布:智能算法 编辑:程序博客网 时间:2024/06/14 20:04

要做到文件上传,客户端编程有几个要点
method的值使用post
enctype的值使用multipart/form-data
每一个控件都要有那么属性
例如

    <form action="upload" method="post" enctype="multipart/form-data">        <input type="file" name="file1"><br />        <input type="submit" value="上传" />    </form>

Servlet配置
1.在Servlet类上使用@MultipartConfig
MultipartConfig的属性
1.fileSizeThershold int型 是(可选) 描述:当前数据量大于该值时,内容将被写入文件。
2.location String型 是(可选) 描述:存放生成文件的地址
3.maxFileSize long型 是(可选) 描述:允许上传的文件最大值,默认为-1,表示没有限制。
4.maxRequestSize long型 是(可选) 描述:针对 multipart/form-data 请求的最大数量,默认为-1,表示没有限制。

@WebServlet("/upload")@MultipartConfigpublic class UploadServlet extends HttpServlet {

2.在web.xml文件的servlet标签中使用multipart-config标签

<servlet>    <servlet-name>uploadservlet</servlet-name>    <servlet-class>com.tanlan.javaees1.UploadServlet</servlet-class>    <multipart-config />  </servlet>  <servlet-mapping>    <servlet-name>uploadservlet</servlet-name>    <url-pattern>/upload</url-pattern>  </servlet-mapping> 

获取文件上传中文件本身的信息
在Multipart请求中,每一个表单控件,都会被转化成一个Part
怎么获取Part呢?
使用HttpServletRequest获取Part
getPart:返回指定名称的part
getParts:返回请求中所有的part

@WebServlet("/upload")@MultipartConfigpublic class UploadServlet extends HttpServlet {    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        Part part = request.getPart("file1");        System.out.println(part.getName());        System.out.println(part.getSubmittedFileName());        System.out.println(part.getSize());        System.out.println(part.getContentType());        Collection<String> heardersNames = part.getHeaderNames();        for (String headerName : heardersNames) {            System.out.println(headerName + ":" + part.getHeader(headerName));        }        String uploadDir=getServletContext().getRealPath("/upload");        part.write(uploadDir+"\\"+part.getSubmittedFileName());    }}

Part接口的方法请参考相关的API文档
接下来有几个比较重要的方法:
write:参数是绝对位置,若是相对位置,则相对location的值
delete删除上传的文件
getInputStream:获取输入流
参数是绝对位置的时候

uploadDir=getServletContext().getRealPath("/upload");part.write(uploadDir+"\\"+part.getSubmittedFileName());

相对位置的时候

@WebServlet("/upload2")@MultipartConfig(maxRequestSize=1024*1024*15,maxFileSize=1024*1024*8,location="C:\\")public class UploadServlet2 extends HttpServlet {    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        System.out.println(request.getParameter("name"));        Collection<Part> parts=request.getParts();        for (Part part : parts) {            //文件            if(part.getContentType()!=null){                String fileName=part.getSubmittedFileName();                if(!fileName.equals("")){                    part.write(fileName);                }            }        }    }

服务器端编程要点:
检查Part是普通表单控件还是文本上传控件,判断content-type的值是否是null
检查文件名是否为null,为空则表示未选择上传文件,判断文件名是否是””
文件存在则调用part的write方法,传入一个绝对路径或相对于location属性指定的路径

        System.out.println(request.getParameter("name"));        Collection<Part> parts=request.getParts();        for (Part part : parts) {            //文件            if(part.getContentType()!=null){                String fileName=part.getSubmittedFileName();                if(!fileName.equals("")){                    part.write(fileName);                }            }        }
原创粉丝点击