文件上传
关键代码:
<form action="地址" method="post" enctype="multipart/form-data">
<input type="file" name="参数名"/>
</form>
注意:
1) method必须是post
2) 必须采用复杂的格式,不能是name=value的参数格式, 必须是multipart/form-data的格式
apache提供了 commons-fileupload.jar包专门用来解析multipart/form-data的格式
依赖: commons-io.jar包
// 通过程序创建目录
new File("e:\\images").mkdirs()
upload.jsp
<%--
Created by IntelliJ IDEA.
User: 浔者
Date: 2018/10/16
Time: 19:12
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>上传</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="text" name="uname" />
<input type="file" name="img" />
<input type="submit" value="提交"/>
</form>
</body>
</html>
UploadServlet.jsp
package cn.seeker.controller;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
@WebServlet(urlPatterns = "/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 提前创建存储图片的目录
new File("f:\\images").mkdirs();
// 将上传文件存入服务器磁盘的一个工具类
DiskFileItemFactory factory = new DiskFileItemFactory();
//核心文件上传工具
ServletFileUpload sfu = new ServletFileUpload(factory);
//10k
sfu.setSizeMax(1024*1024);
try{
List<FileItem> fileItems = sfu.parseRequest(req);
//遍历参数集合
for (FileItem item : fileItems) {
//如果是普通表单项
if(item.isFormField()){
System.out.println("参数名:"+item.getFieldName());
System.out.println("值:"+item.getString("utf-8"));
}else{ //是一个文件
// item.getInputStream() 拿到文件的输入流
// item.write() 写入服务器目标文件
System.out.println("文件长度:"+item.getSize());
if(item.getSize()>0){
System.out.println("文件的原始名:"+item.getName());
item.write(new File("f:\\images\\" + item.getName()));
}
}
System.out.println("----------");
}
} catch (FileUploadBase.SizeLimitExceededException e) {
req.setAttribute("error", "上传的文件超过了大小限制");
req.getRequestDispatcher("/upload.jsp").forward(req, resp);
}catch (FileUploadException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
}
下载
DownloadServlet.java
package cn.seeker.controller;
import org.apache.commons.io.IOUtils;
import sun.nio.ch.IOUtil;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
// 用来下载服务器上F:\download目录下任意的文件
@WebServlet(urlPatterns = "/download/*")
public class DownloadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//当响应的content-type设置为image,浏览器会显示图片
//resp.setContentType("image/jpg");
// 2) 如果要把图片进行下载操作
resp.setContentType("application/octet-stream");
resp.addHeader("content-disposition","attachment");
// 把【浏览器的路径】 转换为 【服务器的磁盘路径】
// 获取浏览器实际输入路径
String uri = req.getRequestURI();
System.out.println(uri);
// 拼接图片的磁盘路径
String path = "f:\\" + uri;
//如果文件不存在,返回404
if(!new File(path).exists()){
resp.sendError(404);
return;
}
//如果存在,从文件输入流读取,向响应的输出路写
FileInputStream is = new FileInputStream(new File(path));
OutputStream os = resp.getOutputStream();
IOUtils.copy(is,os);
IOUtils.closeQuietly(is);
}
}
此处上传下载存在文件名中文乱码问题,暂时没有解决,读者可自行尝试。