java实现文件上传与下载
2016-08-16 09:19
363 查看
昨天跟着网上的一些资源自给写了一个简单的文件上传和下载
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ListFileServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filepath = this.getServletContext().getRealPath("WEB-INF/upload");<pre name="code" class="java">
Map<?, ?> map= new HashMap ();listfile(new File(filepath), map);request.setAttribute("map", map);request.getRequestDispatcher("/listfile.jsp").forward(request, response);}public void listfile(File file,Map map){if (!file.isFile()) {File[]files = file.listFiles();for
(File f : files) { listfile(f, map);}} String realname=file.getName().substring(file.getName().indexOf("_")+1); map.put(file.getName(), realname);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
{doGet(request, response);}}
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
<c:forEach var="me" items="${map}">
<c:url value="/servlet/DownloadServlet" var="downurl">
<c:param name="filename" value="${me.key}"></c:param>
</c:url>
${me.value } <a href="${downurl}">下载</a> <br/>
</c:forEach>
</body>
</html>
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filename = request.getParameter("filename");
filename = new String(filename.getBytes("iso8859-1"),"UTF-8");
String path=makePath(filename, this.getServletContext().getRealPath("/WEB-INF/upload"));
File file = new File(path+"\\"+filename);
if (!file.exists()) {
request.setAttribute("message", "您想下载的资源已经被删除!!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
String realname = filename.substring(filename.indexOf("_")+1 );
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
FileInputStream in = new FileInputStream(path+"\\"+filename);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
out.close();
}
public String makePath(String filename,String savePath){
int hashcode = filename.hashCode();
int dir1=hashcode&0xf;
int dir2=(hashcode&0xf0)>>4;
String dir=savePath+"\\"+dir1+"\\"+dir2;
File file=new File(dir);
if (!file.isFile()) {
file.mkdirs();
}
return dir;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
${message }
</body>
</html>
upload.setHeaderEncoding("UTF-8"); //解决上传文件名的中文乱码
//表单为文件上传,设置request编码无效,只能手工转换
1.1 value = new String(value.getBytes("iso8859-1"),"UTF-8");
1.2 String value = item.getString("UTF-8");
2、为保证服务器安全,上传文件应该放在外界无法直接访问的目录
3、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
4、为防止一个目录下面出现太多文件,要使用hash算法打散存储
5、要限制上传文件的最大值,可以通过:
ServletFileUpload.setFileSizeMax(1024)--->单个文件最大值
方法实现,并通过捕获:
FileUploadBase.FileSizeLimitExceededException异常以给用户友好提示------->总文件最大值的大小
6、想确保临时文件被删除,一定要在处理完上传文件后,调用item.delete方法
7、要限止上传文件的类型:在收到上传文件名时,判断后缀名是否合法
8、监听文件上传进度:
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setProgressListener(new ProgressListener(){
public void update(long pBytesRead, long pContentLength, int arg2) {
System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);
}
});
9、在web页面中动态添加文件上传输入项
1.导入相关jar包
2.编写上传页面upload.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>上传文件界面</title> </head> <body> <form action="${pageContext.request.contextPath }/servlet/UploadServlet" enctype="multipart/form-data" method="post"> 用户名:<input type="text" name="username"> 上传文件1<input type="file" name="file1"> 上传文件2<input type="file" name="file2"> <input type="submit" value="上传"> </form> </body> </html>
3.编写UploadServlet实现文件上传
package com.web; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.UUID; import javax.servlet.ServletException; 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.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class UploadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { request.setCharacterEncoding("utf-8"); String savepath = this.getServletContext().getRealPath("/WEB-INF/upload"); DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("utf-8"); if (!upload.isMultipartContent(request)) { return; } List<FileItem> list = upload.parseRequest(request); for (FileItem item : list) { if (item.isFormField()) { String name= item.getName(); String value = item.getString("utf-8"); System.out.println(name+"="+value); }else { // fileitem中封装的是文件数据 String filename = item.getName(); filename = filename.substring(filename.lastIndexOf("\\")+1); InputStream in = item.getInputStream(); String saveFileName = makefilename(filename); String realSavePath = makePath(saveFileName, savepath); FileOutputStream out = new FileOutputStream(realSavePath+"\\"+saveFileName); byte []buf = new byte[1024]; int len = 0; while((len=in.read(buf))>0){ out.write(buf, 0, len); } in.close(); out.close(); } } } catch (FileUploadException e) { e.printStackTrace(); } } //通过uuid算法+“_”+文件名,生成唯一的文件名 private String makefilename(String filename) { return UUID.randomUUID().toString()+"_"+filename; }
//打散文件路径,通过hashcode算法 private String makePath(String filename,String savepath){ int hashcode = filename.hashCode(); int dir1=hashcode&0xf; int dir2 = (hashcode&0xf0)>>4; String dir=savepath+"\\"+dir1+"\\"+dir2; File file = new File(dir); if (!file.isFile()) { file.mkdirs(); } return dir; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
4.实现文件下载,首先列出站点所有的文件
package com.web;import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ListFileServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filepath = this.getServletContext().getRealPath("WEB-INF/upload");<pre name="code" class="java">
Map<?, ?> map= new HashMap ();listfile(new File(filepath), map);request.setAttribute("map", map);request.getRequestDispatcher("/listfile.jsp").forward(request, response);}public void listfile(File file,Map map){if (!file.isFile()) {File[]files = file.listFiles();for
(File f : files) { listfile(f, map);}} String realname=file.getName().substring(file.getName().indexOf("_")+1); map.put(file.getName(), realname);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
{doGet(request, response);}}
5.跳转到listfile.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
<c:forEach var="me" items="${map}">
<c:url value="/servlet/DownloadServlet" var="downurl">
<c:param name="filename" value="${me.key}"></c:param>
</c:url>
${me.value } <a href="${downurl}">下载</a> <br/>
</c:forEach>
</body>
</html>
6.转到DownloadServlet实现文件下载
package com.web;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filename = request.getParameter("filename");
filename = new String(filename.getBytes("iso8859-1"),"UTF-8");
String path=makePath(filename, this.getServletContext().getRealPath("/WEB-INF/upload"));
File file = new File(path+"\\"+filename);
if (!file.exists()) {
request.setAttribute("message", "您想下载的资源已经被删除!!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
String realname = filename.substring(filename.indexOf("_")+1 );
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
FileInputStream in = new FileInputStream(path+"\\"+filename);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
out.close();
}
public String makePath(String filename,String savePath){
int hashcode = filename.hashCode();
int dir1=hashcode&0xf;
int dir2=(hashcode&0xf0)>>4;
String dir=savePath+"\\"+dir1+"\\"+dir2;
File file=new File(dir);
if (!file.isFile()) {
file.mkdirs();
}
return dir;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
7.设置一个全局消息显示页面message.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
${message }
</body>
</html>
8.总结:文件上传下载需要注意的地方
1、上传文件名的中文乱码和上传数据的中文乱码upload.setHeaderEncoding("UTF-8"); //解决上传文件名的中文乱码
//表单为文件上传,设置request编码无效,只能手工转换
1.1 value = new String(value.getBytes("iso8859-1"),"UTF-8");
1.2 String value = item.getString("UTF-8");
2、为保证服务器安全,上传文件应该放在外界无法直接访问的目录
3、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
4、为防止一个目录下面出现太多文件,要使用hash算法打散存储
5、要限制上传文件的最大值,可以通过:
ServletFileUpload.setFileSizeMax(1024)--->单个文件最大值
方法实现,并通过捕获:
FileUploadBase.FileSizeLimitExceededException异常以给用户友好提示------->总文件最大值的大小
6、想确保临时文件被删除,一定要在处理完上传文件后,调用item.delete方法
7、要限止上传文件的类型:在收到上传文件名时,判断后缀名是否合法
8、监听文件上传进度:
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setProgressListener(new ProgressListener(){
public void update(long pBytesRead, long pContentLength, int arg2) {
System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);
}
});
9、在web页面中动态添加文件上传输入项
function addinput(){ var div = document.getElementById("file"); var input = document.createElement("input"); input.type="file"; input.name="filename"; var del = document.createElement("input"); del.type="button"; del.value="删除"; del.onclick = function d(){ this.parentNode.parentNode.removeChild(this.parentNode); } var innerdiv = document.createElement("div"); innerdiv.appendChild(input); innerdiv.appendChild(del); div.appendChild(innerdiv); }
相关文章推荐
- 用Java实现FTP批量大文件上传下载
- Java I/O实现OAF文件上传与下载
- 通用 Java 文件上传和下载组件的设计与实现
- 用JAVA实现ORACLE数据库的文件上传、下载
- JAVA中使用FTPClient实现文件上传下载
- JAVA 文件上传下载笔记之使用基本IO流实现上传
- Java程序员从笨鸟到菜鸟之(七十一)细谈struts2(十三)struts2实现文件上传和下载详解
- java web 实现 文件上传及下载
- JavaWeb中struts2实现文件上传下载功能实例解析
- JAVA中使用FTPClient实现文件上传下载
- Java中如何使用组件实现文件上传下载
- Java程序员从笨鸟到菜鸟之(七十一)细谈struts2(十三)struts2实现文件上传和下载详解
- JAVA实现FTP服务器文件的上传,下载,删除功能
- Java 利用Apache Commons Net 实现 FTP文件上传下载
- java通过apache ftp实现ftp上传文件,下载文件
- Java 实现ftp文件的上传和下载
- 通用 Java 文件上传和下载组件的设计与实现
- 用Java实现FTP批量大文件上传下载
- JAVA中使用FTPClient实现文件上传下载
- JAVA Ftp实现文件上传于下载