您的位置:首页 > 编程语言 > Java开发

java实现文件上传与下载

2016-08-16 09:19 363 查看
昨天跟着网上的一些资源自给写了一个简单的文件上传和下载

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