文件上传3.0版本
在Servlet3.0之前我们要想实现文件上传必须借助common-fileupload或者SmartUpload,上传过程比较麻烦。而到了Servlet3.0,我们不需要导入任何第三方jar包,并且提供了很方便进行文件上传的功能
主要步骤如下:
- 在需要实现文件上传的Servlet类前加上@MultipartConfig注解
- 通过request.getPart()获得上传的文件,以及文件相关的各种属性
- 通过part.write()将上传的文件写到服务器
前台页面upload3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Servlet3.0文件上传</title>
</head>
<body>
<!-- 如果说表单需要上传文件,必须将enctype设置为multipart/form-data,method必须设置成POST -->
<form action="upload3" method="post" enctype="multipart/form-data">
<p>用户名:<input type="text" name="username"></p>
<p>选择头像:<input type="file" name="myFile"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
后台代码
package com.lanou3g.upload3;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
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;
/**
* Servlet implementation class UploadServlet3
*/
@WebServlet("/upload3")
@MultipartConfig
public class UploadServlet3 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("<script>alert('文件上传不支持GET请求!');location.href='upload3.jsp';</script>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置编码方式
request.setCharacterEncoding("UTF-8");
// 接收文本类型请求参数
String username = request.getParameter("username");
// 接收上传文件的域(参数值对应表单中file域的name属性值)
Part myFile = request.getPart("myFile");
String formItemName = myFile.getName();
String fileName = myFile.getSubmittedFileName();
// myFile.getInputStream(); // 上传的文件对象对应的字节流
String contentType = myFile.getContentType();// 上传的文件类型
long fileSize = myFile.getSize();
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h1>文件上传后台</h1><br />");
out.println("<ul>");
out.println("<li>表单中提交的普通参数username:"+username+"</li>");
out.println("<li>表单中上传文件域的name值:"+formItemName+"</li>");
out.println("<li>表单中上传的文件名称:"+fileName+"</li>");
out.println("<li>表单中上传的文件类型:"+contentType+"</li>");
out.println("<li>表单中上传的文件大小(byte):"+fileSize+"</li>");
out.println("</ul>");
// 上传到固定路径下
myFile.write("E:/11/"+fileName);
out.println("<h2>文件上传成功!</h2>");
out.println("<a href='upload3.jsp'>返回继续上传</a>");
}
在浏览器中输入上传文件的地址页面如图所示
找一张图上传
图片保存到硬盘固定位置
文件上传成功
上传到项目的相对位置
比如上传到WebContent下新建一个upload文件夹
package com.lanou3g.upload3;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
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;
/**
* Servlet implementation class UploadServlet3
*/
@WebServlet("/upload3")
@MultipartConfig
public class UploadServlet3 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("<script>alert('文件上传不支持GET请求!');location.href='upload3.jsp';</script>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置编码方式
request.setCharacterEncoding("UTF-8");
// 接收文本类型请求参数
String username = request.getParameter("username");
// 接收上传文件的域(参数值对应表单中file域的name属性值)
Part myFile = request.getPart("myFile");
String formItemName = myFile.getName();
String fileName = myFile.getSubmittedFileName();
// myFile.getInputStream(); // 上传的文件对象对应的字节流
String contentType = myFile.getContentType();// 上传的文件类型
long fileSize = myFile.getSize();
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h1>文件上传后台</h1><br />");
out.println("<ul>");
out.println("<li>表单中提交的普通参数username:"+username+"</li>");
out.println("<li>表单中上传文件域的name值:"+formItemName+"</li>");
out.println("<li>表单中上传的文件名称:"+fileName+"</li>");
out.println("<li>表单中上传的文件类型:"+contentType+"</li>");
out.println("<li>表单中上传的文件大小(byte):"+fileSize+"</li>");
out.println("</ul>");
// 上传到固定路径下
// myFile.write("E:/11/"+fileName);
// 上传到相对于项目路径的目录下
myFile.write(getRealPath("/upload",fileName,request));
out.println("<h2>文件上传成功!</h2>");
out.println("<a href='upload/"+fileName+"'>"+fileName+"</a><br />");
out.println("<a href='upload3.jsp'>返回继续上传</a>");
}
/**
* 根据传入的相对于项目根路径的路径,返回该路径在物理硬盘上的绝对路径
* @param relativePath 要保存到硬盘上的目录相对于项目的路径
* @param fileName 要保存到硬盘上的文件名称
* @param req 请求对象
* @return
* 要保存的文件在硬盘上的绝对完整路径
*/
private String getRealPath(String relativePath, String fileName, HttpServletRequest request) {
System.out.println("相对路径:"+relativePath);
// 1. 获取ServletContext上下文对象
ServletContext ctx = request.getServletContext();
// 2. 获取相对路径对应在硬盘上的绝对路径
String realPath = ctx.getRealPath(relativePath);
System.out.println("绝对路径:"+realPath);
// 3. 用绝对路径拼上文件名称,最终得到该文件对应的完整绝对路径
String finalPath = realPath+"/"+fileName;
System.out.println("最终文件路径:" + realPath);
return finalPath;
}
}
这里面没有
最终上传到哪里了呢?看控制台
后台页面
点击图片可以查看
把代码加上download就可以下载
//out.println("<a href='upload/"+fileName+"'>"+fileName+"</a><br />");
//可以下载加上download
out.println("<a href='upload/"+fileName+"'download>"+fileName+"</a><br />");