Java Web开发中文件的上传与下载 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 网站建设 >

Java Web开发中文件的上传与下载

发表时间:2019-8-7

发布人:葵宇科技

浏览次数:24

如何实现文件的上传

实现Web开发中文件上传功能的两个步骤:

  • 在Web页面添加上传输入项
  • 在Servlet中读取上传文件的数据并保存到本地硬盘中

由于大多数文件的上传都是通过表单 的形式提交给服务器的,故需要先创建一个用于提交上传文件的表单页面。
实现文件上传的表单页面需如下配置:

  1. 首先要创建一个用于提交上传文件的表单页面
  2. 在页面中,需要使用 < input type=“file”> 标签在Web页面中添加文件上传输入项
  3. 必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据
  4. 必须把将表单页面的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.jarcommons-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,单击页面中的文件下载链接后,即可保存下载该文件

相关案例查看更多