java web 实现多文件以表单的形式上传
前言
Java web 实现文件上传功能,需要从apache官网自行下载
commons-fileupload-1.4 jar和commons-io-2.6 jar 两个jar包
创建上传表单form.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="/chapter12/UploadServlet" method="post" enctype="multipart/form-data" >
<table>
<tr>
<td>文件1:</td>
<td><input type="file" name="File1" size=30 /></td>
</tr>
<tr>
<td>文件2:</td>
<td><input type="file" name="File2" size=30 /></td>
</tr>
<tr>
<td>文件3:</td>
<td><input type="file" name="File3" size=30 /></td>
</tr>
<tr>
<td><input type="submit" value="上传" /></td>
</tr>
</table>
</form>
</body>
</html>
服务器端servlet代码如下
import java.io.*;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
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 org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class UploadServlet
*/
@WebServlet("/UploadServlet")
public class UploadServlet 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 {
// TODO Auto-generated method stub
try {
response.setContentType("text/html;charset=utf-8");
//创建DiskFileItemFactory工厂对象
//使用DiskFileItemFactory时需从apache官网下载对应jar包
//DiskFileItemFactory的学习文末设置链接,一个详细API学习。
DiskFileItemFactory factory=new DiskFileItemFactory();
//设置缓存路径
File fip=new File("E:\\TempFolder");
//文件不存在则创建新文件夹
if(!fip.exists())
{
fip.mkdirs();
}
//设置文件的缓存路径
factory.setRepository(fip);
//创建servletfileupload对象
//ServletFileUpload的使用也需下载相应jar包
ServletFileUpload fileUpload=new ServletFileUpload(factory);
//设置字符编码
fileUpload.setHeaderEncoding("utf-8");
//解析request,获取所有上传文件的fileitem对象(可以实现一个和多个文件上传)
//需要注意,若在提交页面的表单之中,对于上传的文件有多个,则按照顺序存入集合之中。
List<FileItem> fileItems = fileUpload.parseRequest(request);
PrintWriter writer = response.getWriter();
//遍历集合
for(FileItem fileItem : fileItems)
{
//获取文件名称
//此处获取的文件名称包含了上传的路径
String filename=fileItem.getName();
if(!filename.equals("")&&filename!=null)
{
//从后向前切割字符串,+1则可得到\\之前的文件名称
filename=filename.substring(filename.lastIndexOf("\\")+1);
//此处随意,保存文件名
String fileString=filename;
//确保文件名唯一
filename = UUID.randomUUID().toString() + "_"+ filename;
//在服务器中创建同名文件
String webpath = "/upload/";
//webpath+filename为服务器端完整路径
String filepath=getServletContext().getRealPath(webpath+filename);
//创建文件
File file = new File(filepath);
file.getParentFile().mkdirs();
file.createNewFile();
//获得上传文件流
InputStream in= fileItem.getInputStream();
FileOutputStream out = new FileOutputStream(file);
byte buffer[]=new byte[1024];
int len;
//以1字节读取上传文件字节,并将其输出到服务端的上传文件输出流中
while((len=in.read())>0)
out.write(buffer,0,len);
in.close();
out.close();
//删除临时文件
fileItem.delete();
writer.println("文件:"+fileString+"---->>上传成功!"+"<br />");
}
}
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
文件上传还有更为简洁的方式,请自行查阅,本代码仅供参考
通过链接实现文件下载
创建download.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="/chapter12/DownloadServlet?filename=工作日志2017上半年.txt"> 文件下载</a>
</body>
</html>
创建DownloadServlet
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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 org.apache.commons.io.IOUtils;
/**
* Servlet implementation class DownloadServlet
*/
@WebServlet("/DownloadServlet")
public class DownloadServlet 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 {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
String filename=request.getParameter("filename");
filename = new String(filename.trim().getBytes("iso8859-1"),"UTF-8");
//以上代码用于解决获取的下载文件名乱码问题
// 创建下载路径(预下载文件保存的位置)
String folder="E:/";
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition", "attachment;filename="+filename);
InputStream in=new FileInputStream(folder+filename);
OutputStream out=response.getOutputStream();
IOUtils.copy(in,out);
InputStream in1=getServletContext().getResourceAsStream(folder+filename);
OutputStream out1=response.getOutputStream();
byte [] buffer=new byte [1024];
int len;
while((len=in.read(buffer))!=-1)
{
out.write(buffer,0,len);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
本文章仅供学习参考,不足之处望指正!
学习链接
链接: DiskFileItemFactory API详解.
ServletFileUpload API详解
UUID 简略学习