Servlet文件上传

来源:互联网 发布:做不喜欢的事 知乎 编辑:程序博客网 时间:2024/06/05 10:03


本文转自http://blog.csdn.net/qq_34092336/article/details/77061899

欢迎大家访问原博并点赞。




Servlet3中的Part接口和@MultipartConfig注解使文件上传变得非常简单,本文对文件上传相关代码进行讲解。


开发工具:Intellij IDEA、tomcat9.0

(开发工具很随意,使用eclipse+tomcat8等都可以完成工作)


上传文件当然首先要提供一个可视界面,这里我们在web目录下新建文件index.jsp。要想上传文件,需要注意的是须设置表单的enctype属性值为multipart/form-data,就像这样:enctype="multipart/form-data" ,下面贴出index.jsp的源代码:

<%--  Created by IntelliJ IDEA.  User: cbw  Date: 2017/8/10  Time: 10:10  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html>  <head>    <title>upload</title>  </head>  <body>    <h1>Select file to upload</h1>    <form action="singleUpload" enctype="multipart/form-data" method="post">      Author:<input type="text" name="author"/><br>      Select file:<input type="file" name="filename"/><br>      <input type="submit" value="upload">    </form>  </body></html>


我们注意到上面form的action提交到了singleUpload里,所以这里我们要新建一个Servlet,我新建的是SingleUploadServlet,我们先贴出代码片,再对代码进行讲解。

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;import java.io.IOException;import java.io.PrintWriter;/** * Created by cbw on 2017/8/10. */@WebServlet(name = "SingleUploadServlet",urlPatterns = {"/singleUpload"})@MultipartConfigpublic class SingleUploadServlet extends HttpServlet {    private static final long serialVersionUID=8593038L;    private String getFilename(Part part){        String contentDispositionHeader=part.getHeader("content-disposition");        String[]elements=contentDispositionHeader.split(";");        for(String element:elements){            if (element.trim().startsWith("filename")){                return element.substring(element.indexOf('=')+1).trim().replace("\"","");            }        }        return null;    }    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        Part part=request.getPart("filename");String fileName=getFilename(part);Part part=request.getPart("filename");        String fileName=getFilename(part);        if(fileName!=null && !fileName.isEmpty()){            part.write("D:\\IDEA\\project\\upload\\web\\images"+"/"+fileName);        }        response.setContentType("text/html");        PrintWriter writer=response.getWriter();        writer.print("<br/>Name:"+fileName);        writer.print("<br/>Size:"+part.getSize());        String author=request.getParameter("author");        writer.print("<br/>Author:"+author);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    }}

首先我们要给该Servlet加上两个注解:

@WebServlet(name = "SingleUploadServlet",urlPatterns = {"/singleUpload"})@MultipartConfig

@WebServlet用于接受index.jsp中form传过来的action

@MultipartConfig用于文件传送

由于我们提交表单的方法是post,这里我们在doPost函数中完成上传的服务器端操作。

主要的思路是:先把file取出来放到一个Part里,再写入我们要存放的位置,我们来看这两句代码:

Part part=request.getPart("filename");String fileName=getFilename(part);

注意这里的filename并不是文件的真实名字,是建立jsp和servlet传递数据的参数名,我们如果想要获得原始文件名,需要getFileName()这个方法,然后再通过这样的语句,几行代码写入:

"D:\\IDEA\\project\\upload\\web\\images"是你要写入的位置

if(fileName!=null && !fileName.isEmpty()){    part.write("D:\\IDEA\\project\\upload\\web\\images"+"/"+fileName);}

下面我们来看getFileName方法。

值得一提的是,当上传一个123.png文件时,我们取出的标头格式是下面这样的(可以自行打印验证):

content-disposition:form-data;name="document";filename="123.png"

所以我们要获得的便是123.png这个字段,相关对字符串的操作方法,这里不作说明。

这样我们就完成了文件上传的操作。



我这里的所有代码都是自己运行通过了的,如果很不幸您的程序出了bug,请访问下载该项目的源代码:

https://github.com/alwaysbeloved/upload

原创粉丝点击