文件及图片的上传及下载
配置:
pom.xml文件图片上传依赖:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
JSP文件
标签:enctype属性规定在发送到服务器之前应该如何对表单数据进行编码
文件上传
<form action="load" method="post" enctype="multipart/form-data">
上传文件:<input type="file" name="myfile" /><br />
文件描述:<input type="text" name="discr" size="20" /><br>
<input type="submit" value="文件提交" />
</form>
action="load"的Servlet代码
/*
* 1、DiskFileItemFactory :把表单提交的图片、文本等空间对象封装成一个个
的FileItem
* ServletFileUpload :支持文件上传的servlet类 2、 调用
* parseRequest(request)解析出FileItem对象的List集合;
* 3、isFormField():返回true说明FileItem封装的是非文件,反之是文件;
* 4、如果是非文件:获取控件的名字和值:getFieldName()/getString();
* 5、如果是文件:获取文件的名字:getName();FileItem.getInputStream();
*/
// 创建工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
File f = new File("F:\\target");
if (!f.exists()) {
// mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹
f.mkdirs();
}
// 设置文件的缓存路径
factory.setRepository(f);
// 创建fileupload组件
ServletFileUpload fileupload = new ServletFileUpload(factory);
fileupload.setHeaderEncoding("utf-8");
try {
// 解析request
List<FileItem> fileItems = fileupload.parseRequest(request);
//遍历集合
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();
System.out.println("文件名字:" + filename);
//处理文件路径名
filename = filename.substring(filename.
lastIndexOf("\\") + 1);
//创建存放上传文件的文件夹
String webPath = "/upload/";
//映射路径转化成物理路径(获取物理路径)
String filepath = request.getServletContext()
.getRealPath(
webPath + filename);
System.out.println("物理路径:" + filepath);
// 创建文件(转化成文件对象)
File file = new File(filepath);
file.getParentFile().mkdirs();
file.createNewFile();
InputStream inputStream = fileItem.getInputStream();
OutputStream outputStream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = -1;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
// 关闭流
inputStream.close();
outputStream.close();
// 删除临时文件
fileItem.delete();
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
文件展示
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取servletcontext对象,获取给定的文件在服务器上面的绝对路径 (实际上输出的就是文件在电脑中的绝对路径,也就是读取web中的资源文件;)
String path = request.getServletContext().getRealPath("/upload");
//转化File对象
File file = new File(path);
File[] fs = file.listFiles();
List<String> names = new ArrayList<String>();
for(File f:fs){
String fileName = f.getName();
names.add(fileName);
System.out.println(fileName);
}
request.setAttribute("names", names);
request.getRequestDispatcher("show.jsp").forward(request, response);
}
show.jsp文件
<c:forEach items = "${names}" var="name">
<a href = "${pageContext.request.contextPath}/down?name=${name}">
<img src="${pageContext.request.contextPath }/down?name=${name}"
width="300" height="200"/></a><br/>
</c:forEach>
文件下载
href="down"的servlet代码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String name = request.getParameter("name");
String path = request.getServletContext().getRealPath("/upload/");
File f = new File(new File(path), name);
//增加文件消息头,告诉浏览器是下载
response.addHeader("Content-Type", "application/x-msdownload");
response.addHeader("Content-Disposition", "attachment;filename=" + name);
System.out.println(path+name);
// 对当前下载文件创建输入流
InputStream in = new FileInputStream(f);
OutputStream out = response.getOutputStream();
byte[] buffere=new byte[1024];
int len=-1;
while((len=in.read(buffere))!=-1){
out.write(buffere, 0, len);
}
OK了