文件上传和下载需要用到Apach的开源jar包commons-fileupload和commons-io两个。本次上传下载以图片为例。其他文件同理。
上传界面
因为是上传文件,所以只能以post方式提交,同时还要在form里添加enctype="multipart/form-data"表示以二进制流上传文件。文件加载界面用到了jquery需要添加jquery-1.8.3.js。返回文件列表json对象用到了阿里巴巴的fastjson,需要导入jar包。jar包下载地址:下载地址
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form method="post" action="MyServlet?action=up" enctype="multipart/form-data">
文件:<input type="file" name="file"/>
文件:<input type="file" name="file"/>
文件:<input type="file" name="file"/>
文件:<input type="file" name="file"/>
<input type="submit" value="提交" />
<a href="down.jsp">查看图片</a>
</form>
</body>
</html>
文件下载界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>图片下载</title>
<script type="text/javascript" src="js/jquery-1.8.3.js"></script>
<script type="text/javascript">
$(function () {
$("#btn").click(function () {
// 每次点击显示图片移除原有的图片 防止重复出现
$("img").remove();
$("br").remove();
//将div隐藏 用于显示后面的动画
$("#d1").hide();
//利用ajax获取servlet返回的文件列表json对象
$.getJSON("MyServlet?action=showPicture",function(data){
//遍历json字符串 data即为返回的json数据
$(data).each(function(i){
//定义一个节点 设为左浮动 用于一行展示多张图片
var node="<img style='float: left; padding: 10px ' src="+data[i]+" alt="+data[i]+" width='300px'/>";
//将节点添加到div节点的最后一个节点
$("#d1").append(node);
});
//图片全部加载完 下滑动画展示
$("#d1").slideDown(3000);
//为图片设置点击事件 点击即可调用servlet下载
$("img").click(function () {
alert($(this).attr("src"))
window.location="MyServlet?action=down&filename="+$(this).attr("src");
});
});
});
});
</script>
</head>
<body>
<input id="btn" type="button" value="显示图片" />
<div id="d1" ></div>
</body>
</html>
处理文件上传和下载
直接贴源码,详细内容在注释。
import com.alibaba.fastjson.JSON;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
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.FileReader;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
/**
* Created by ljb Cotter on 2018/9/7.
*/
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理乱码
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
//获取请求的操作
String action=request.getParameter("action");
System.out.println(action);
if (action.equals("up")){//上传文件
doUp(request, response);
}else if (action.equals("showPicture")){//显示所有的图片
showPicture(request, response);
}else if (action.equals("down")){//下载图片
downImg(request, response);
}
}
/**
* 上传图片
* @param request
* @param response
*/
private void doUp(HttpServletRequest request, HttpServletResponse response) {
//在web文件夹下面建立了一个file文件夹用来存放上传的文
//获取文件夹的路径
String savaPath=request.getServletContext().getRealPath("file/");
File file=new File(savaPath);
//如果文件夹不存在就创建一个
if (!file.exists()&&!file.isDirectory()){
file.mkdirs();
}
//创建文件上传解析工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
//创建解析器
ServletFileUpload upload=new ServletFileUpload(factory);
//处理文件上传时包含中文名的问题
upload.setHeaderEncoding("utf-8");
//判断是否以二进制上传,不是则结束程序
if (!ServletFileUpload.isMultipartContent(request)){
return;
}
try {
//获取上传表单元素集合
List<FileItem> fileItems=upload.parseRequest(request);
//遍历集合。每个fileItem对应一个表单输入元素
for (FileItem fileItem : fileItems) {
//判读是否为普通表单 也就是文本
if (fileItem.isFormField()){
String name=fileItem.getFieldName();
String value=fileItem.getString("utf-8");
System.out.println(name+"---------"+value);
}else {//是文件
String fileName=fileItem.getName();
if (fileName==null||fileName.equals("")){
//文件名为空则不上传
}else {
//防止文件名重复加一个4个长度的十六进制的UUID
fileName= UUID.randomUUID()+"__"+fileItem.getName();
File newfile=new File(savaPath,fileName);
System.out.println(newfile.getAbsolutePath());
//用FileItem自带的write方法上传文件
fileItem.write(newfile);
fileItem.delete();//上传完成删除该项
System.out.println(fileName+"上传成功");
//提示用
response.getWriter().write(fileName+"上传成功<br/>");
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/***
* 返回图片地址的json用来所上传的展示图片
* @param request
* @param response
* @throws IOException
*/
private void showPicture(HttpServletRequest request, HttpServletResponse response) throws IOException {
//获取文件保存的路径
String savePath=request.getServletContext().getRealPath("file/");
File files=new File(savePath);
System.out.println(files.getAbsolutePath());
//获取所有文件的集合
File[] fileList=files.listFiles();
System.out.println(Arrays.toString(fileList));
//用来存放截取后的文件名
List list=new ArrayList();
for (File file : fileList) {
String path=file.getPath();
//将文件名进行截取,获取相对路径
String temp=path.substring(path.indexOf("file"));
//将文件名的\替换为/否则会出错
temp=temp.replaceAll("\\\\","/");
list.add(temp);
}
//利用阿里巴巴的fastjson将文件名集合转成json字符串
String json= JSON.toJSONString(list);
System.out.println(json);
//将json对象返回给前端界面 ,用来展示图片
response.getWriter().write(json);
}
/***
* 下载图片
* @param request
* @param response
* @throws IOException
*/
private void downImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
//获取要下载的文件路径 此时是相对路径
String pathName=request.getParameter("filename");
System.out.println("*****************************"+pathName);
//截取文件路径,获取该文件的文件名
String fileName=pathName.substring(pathName.lastIndexOf("/")+1);
System.out.println("--------------"+fileName);
//获取要下载的文件的绝对路径
pathName=request.getServletContext().getRealPath(pathName);
//解决下载的文件有中文乱码的问题
fileName=URLEncoder.encode(fileName,"utf-8");
//设置头信息,Content-Disposition 用来激活浏览器的文件下载对话框,attachment表示是一个附件,filename下载的文件名
response.setHeader("content-disposition","attachment;filename="+fileName);
System.out.println("*********"+pathName);
//利用org.apache.commons.io的IOUtils将文件写出
IOUtils.copy(new FileReader(pathName),response.getOutputStream());
}
}

本文详细介绍了使用Apache的commons-fileupload和commons-io库实现文件上传和下载的技术细节,包括HTML表单配置、Servlet处理逻辑、文件路径处理及JSON数据交互。
1176

被折叠的 条评论
为什么被折叠?



