Java Web开发中文件的上传与下载
发表时间:2019-8-7
发布人:葵宇科技
浏览次数:41
如何实现文件的上传
实现Web开发中文件上传功能的两个步骤:
- 在Web页面添加上传输入项
- 在Servlet中读取上传文件的数据并保存到本地硬盘中
由于大多数文件的上传都是通过表单 的形式提交给服务器的,故需要先创建一个用于提交上传文件的表单页面。
实现文件上传的表单页面需如下配置:
- 首先要创建一个用于提交上传文件的表单页面
- 在页面中,需要使用 < input type=“file”> 标签在Web页面中添加文件上传输入项
- 必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据
- 必须把将表单页面的method属性设置为post方式,enctype属性设置为 “multipart/form-data” 类型。
示例代码:
<%--指定表单的enctype属性以及提交方式--%>
<form enctype="multipart/form-data" method="post">
<%--指定标记的类型和文件域的名称--%>
选择上传文件:< inpurt type="file" name="myfile"/><br />
</form>
Apache组织提供一个开源组件Commons-FileUpload,可以方便的将 “multipart/form-data” 类型请求中的各种表单域解析出来,并实现一个或多个文件的上传,同时也可以限制上传文件的大小等内容。使用时需要导入commons-fileupload.jar和commons-io.jar两个JAR包,可去官网:"http://commons.apache.org/"下载(在网址页面Apache Commons Proper下方表格的Components列中的FileUpload和IO)。
如何实现文件的下载
实现文件下载不需要使用第三方组件,直接使用Servlet类和输入/输出流即可。
与访问服务器文件不同的是,要实现文件的下载,不仅需要指定文件的路径,还需要在HTTP协议中设置两个响应消息头:
//设置接受程序处理方式
Content-Disposition:attachment;filename=
//设定实体内容的MIME类型(多用途互联网邮件扩展类型)
Content-Type:appliccation/x-msdownload
简述文件下载的实现原理:
首先获取下载文件的地址,并根据该地址创建文件字节输入流,然后通过该流读取下载文件内容,最后将读取的内容通过输出流写到目标文件中。
实例问题一:
请按照以下要求设计一个实现文件上传的类UploadServlet?
要求如下:
1) 已知form.html文件中form表单内定义了一个名为name的文本框及名为myfile的文件域,具备文件上传的前提条件。
2)在doPost()方法中,写出文件上传的相关代码。
3)上传的文件保存在当前应用程序的upload文件夹下。
解:UploadServlet代码如下:
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
try { // 创建工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File("e:\\Target"));
ServletFileUpload fileupload = new ServletFileUpload(factory); // 创建 fileupload 组件
fileupload.setHeaderEncoding("utf-8");
List<FileItem> fileitems = fileupload.parseRequest(request); // 解析 request
PrintWriter writer = response.getWriter();
for (FileItem fileitem : fileitems) { // 遍历集合
if (fileitem.isFormField()) { // 判断是否为普通字段
String name = fileitem.getFieldName(); // 获得字段名和字段值
String value = fileitem.getString("utf-8");
} else { // 上传的文件路径
String filename = fileitem.getName();
writer.print("文件来源:" + filename + "<br>");
filename = filename // 截取出文件名
.substring(filename.lastIndexOf("\\") + 1);
writer.print("成功上传的文件:" + filename + "<br>");
filename = UUID.randomUUID().toString() + "_" + filename; // 文件名需要唯一
String webPath = "/upload/" + filename; // 在服务器创建同名文件
String path = getServletContext().getRealPath(webPath);
File file = new File(path); // 创建文件
file.getParentFile().mkdirs();
file.createNewFile();
InputStream in = fileitem.getInputStream(); // 获得上传文件流
OutputStream out = new FileOutputStream(file); // 获得写入文件流
byte[] buffer = new byte[1024]; // 流的对拷
int len;
while ((len = in.read(buffer)) > 0)
out.write(buffer, 0, len);
in.close(); // 关流
out.close();
fileitem.delete(); // 删除临时文件
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
实例问题二:
请编写一个用于实现文件下载的程序,并且保证下载文件的文件名不能出现中文乱码问题?
解:
该功能的实现步骤如下:
(1)创建下载页面download.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件下载</title>
</head>
<body>
<a href="${pagContext.request.contextPath}/chapter06/DownloadServlet"}>
文件下载
</a>
<br />
</body>
</html>
(2)编写DownloadServlet类,该类主要用于设置所要下载的文件以及文件在浏览器中的打开方式,并使用 encode(String s, String enc) 方法,将URL中的字符串以指定的编码形式输出,防止文件名出现中文乱码问题
import java.io.*;
import java.net.URLEncoder;
import javax.servlet.*;
import javax.servlet.http.*;
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 获得绝对路径创建文件对象
String path=getServletContext().getRealPath("/download/人物.jpg");
File file=new File(path);
// 通知浏览器以下载的方式打开文件
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition","attachment;filename="
+URLEncoder.encode(file.getName(),"utf-8"));
InputStream in=new FileInputStream(file); // 通过文件对象获取文件相关的输入流
OutputStream out = response.getOutputStream(); // 获取response对象的输出流
byte [] buffer=new byte[1024];
int len;
while((len=in.read(buffer))!=-1){
out.write(buffer,0,len);
}
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
(3)使用IE浏览器访问该download.jsp,单击页面中的文件下载链接后,即可保存下载该文件