Servlet文件上传

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"})
@MultipartConfig
public 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






  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Servlet文件功能可以通过使用注解@MultipartConfig将Servlet标识为支持文件,然后将multipart/form-data的POST请求封装成Part对象,通过Part对象对上文件进行操作。以下是一个文件Servlet示例代码: ```java @WebServlet("/uploadServlet") @MultipartConfig // 如果是文件,必须要设置该注解! public class UploadServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("文件..."); // 设置请求的编码格式 req.setCharacterEncoding("UTF-8"); // 获取普通表单项(获取参数) String uname = req.getParameter("uname"); // 表单中表单元素的name属性值 System.out.println("uname: " + uname); // 获取Part对象(Servlet将multipart/form-data的POST请求封装成Part对象) Part part = req.getPart("myfile"); // 通过Part对象得到上文件名 String fileName = part.getSubmittedFileName(); System.out.println("上文件名:" + fileName); // 得到文件存放的路径 String filePath = req.getServletContext().getRealPath("/"); System.out.println("文件存放路径:" + filePath); // 上文件到指定目录 part.write(filePath + "/" + fileName); } } ``` 而文件下载功能可以通过设置download属性来实现。以下是一个文件下载的JSP页面的示例代码: ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>文件下载</title> </head> <body> <!-- 浏览器能够识别的资源 --> <a href="download/hello.txt">文本文件</a> <a href="download/pic.jpg">图片文件</a> <!-- 浏览器不能够识别的资源 --> <a href="download/zzz.rar">压缩文件</a> <hr> <a href="download/hello.txt" download>文本文件</a> <a href="download/pic.jpg" download="test.png">图片文件</a> <hr> <form action="downloadServlet"> 文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名"> <button>下载</button> </form> </body> </html> ``` 以上是文件和下载的实现方法,你可以根据需要进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值