Servlet的文件上传与下载

工程目录结构:

文件上传

文件上传用到了commons-fileupload-1.2.1.jar和commons-io-1.4.jar两个jar包。指定将文件上传到服务器的store目录下。

fileupload.jsp:

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="username" size="14"><br>
文件:<input type="file" name="file1" size="14">
<input type="submit" value="上传">
</form>
</body>
</html>
这里需要注意两点:第一method方法必须修改为post。第二为form标签添加enctype属性,且值必须为multipart/form-data。<form>标记的enctype属性的默认值为"application/x-www-form-urlencoded",也就是说若未明确添加enctype属性,则使用这个默认值。enctype属性用于指定表单数据的MIME类型,默认值表示表单数据会采用“名字=值”的形式。而对于文件上传,这里必须取值“multipart/form-data”。

FileUploadServlet.java

public class FileUploadServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		request.setCharacterEncoding("UTF-8");
		DiskFileItemFactory factory=new DiskFileItemFactory();
		ServletFileUpload sfu=new ServletFileUpload(factory);
		try {
			List<FileItem> items=sfu.parseRequest(request);
			for(int i=0;i<items.size();i++){
				FileItem item=items.get(i);
				if(item.isFormField()){
					//普通表单域
					String paraName=item.getFieldName();
					String paraValue=item.getString();
				}else{
					//文件域
					ServletContext ctx=getServletContext();
					String path=ctx.getRealPath("store");
					String fileName=item.getName();
					fileName=fileName.substring(fileName.lastIndexOf("/")+1);
					File file=new File(path+"/"+fileName);
					item.write(file);
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

点击上传,然后到服务器的应用下的store目录下可看到刚才上传的文件。

文件下载

filedownload.jsp:

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<form action="download">
输入要下载的文件名:<br>
<input type="text" name="filename"><input type="submit" value="开始下载">
</form>
</body>
</html>
我们输入刚才上传的web.jpg文件:

FileDownloadServlet.java:

public class FileDownloadServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("UTF-8");
		String filename=request.getParameter("filename");
		System.out.println(filename);
		response.setContentType("application/force-download");
		response.setHeader("Content-Disposition","attachment;filename="+filename);
		ServletContext ctx=getServletContext();
		InputStream in=ctx.getResourceAsStream("store/"+filename);
		System.out.println(in==null);
		OutputStream out=response.getOutputStream();
		int hasRead=0;
		byte[] buffer=new byte[1024];
		while((hasRead=in.read(buffer))!=-1){
			out.write(buffer,0,hasRead);
		}
		out.close();
		in.close();
	}

}
点击开始下载,可以看到浏览器弹出提示下载框。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值