Servlet文件上传与下载

一、文件上传

1.文件上传对表单的要求

<body>
	<!-- 文件上传对表单的要求
		1.请求提交方式必须是post
		2.表单中应指定所提交的请求为multipart请求
		3.在form表单中添加enctype属性,其值为multipart/form-data
		4.表单元素要有file
	 -->
	 <form action="${pageContext.request.contextPath }/photo" method="post" enctype="multipart/form-data">
	 	照片:<input type="file" name="photo" />
	 	<br>
	 	<input type="submit" value="提交" />
	 </form>
</body>

2.手工接收上传的文件

package Servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Photo extends HttpServlet 
{
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		//以输入流的形式获取multipart请求的请求体
		ServletInputStream inputStream = request.getInputStream();
		//将输入流的数据写入到标准输出流
		PrintWriter out = response.getWriter();
		int len = -1;
		byte[] buffer = new byte[1024];
		while((len = inputStream.read(buffer)) != -1) 
		{
			String s = new String(buffer,0,len);
			out.print(s);
		}
		//关闭输入流
		inputStream.close();
	}
}

3.引入Jar包接收上传的文件

在这里需要引入两个jar包:commons-fileupload-1.4.jar和commons-io-2.8.0.jar
下面演示的是最简单的接收形式,既没有对上传文件的大小进行限制,也没有设置文件临时目录

package Servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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;

public class Photo extends HttpServlet 
{
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		//判断是否是multipart请求
		if(!ServletFileUpload.isMultipartContent(request)) 
		{
			throw new RuntimeException("当前请求不支持文件上传");
		}
		try 
		{
			//创建一个FileItem工厂
			DiskFileItemFactory factory = new DiskFileItemFactory();
			//创建文件上传核心组件
			ServletFileUpload upload = new ServletFileUpload(factory);
			//解析请求,获取到所有的Item
			List<FileItem> formItems = upload.parseRequest(request);
			//遍历Items
			for (FileItem item : formItems) 
			{
				//如果item是普通表单项(不是多媒体)
				if(item.isFormField()) 
				{
					//获取表单项名称
					String fieldName = item.getFieldName();
					//获取表单项的值
					String fieldValue = item.getString();
					System.out.println(fieldName + " = " + fieldValue);
				}
				//若item为文件表单项
				else 
				{
					//获取文件名
					String fileName = new File(item.getName()).getName();
					//获取输入流,其中有上传文件的内容
					InputStream is = item.getInputStream();
					//获取文件保存在服务器的路径
					String path = this.getServletContext().getRealPath("/image");
					//创建目标文件
					File f = new File(path,fileName);
					//创建文件输出流
					OutputStream os = new FileOutputStream(f);
					//将输入流中的数据写入到输出流中
					int len = -1;
					byte[] buffer = new byte[1024];
					while((len = is.read(buffer)) != -1) 
					{
						os.write(buffer, 0, len);
					}
					//关闭流
					os.close();
					is.close();
				}
			}
		}
		catch (FileUploadException e) 
		{
			e.printStackTrace();
		}
	}
}

二、文件下载

1.直接以超链接形式下载

缺点:能被浏览器解析的文件会直接在网页上打开,不会以附件形式下载

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Download</title>
	</head>
	<body>
		<!--以超链接形式下载文件-->
		<a href="${pageContext.request.contextPath }/resource/abc.txt">abc.txt</a>
		<br>
		<a href="${pageContext.request.contextPath }/resource/jstl.jar">jstl.jar</a>
	</body>
</html>

2.Servlet方式的文件下载

注意:文件名中文乱码问题

package Servlet;

import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownLoad extends HttpServlet 
{
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		//解决文件名的中文乱码问题
		String filename = "你好.txt";
		//按照当前字符集打散
		byte[] bytes = filename.getBytes("UTF-8");
		//按照目标编码进行组装
		filename = new String(bytes,"ISO8859-1");
		//修改相应的头部属性content-disposition的值为attachment并设置文件名
		response.setHeader("content-disposition", "attachment;filename=" + filename );
		//获取连接服务器资源文件的输入流
		InputStream is = this.getServletContext().getResourceAsStream("/resource/abc.txt");
		//获取输出流
		ServletOutputStream os = response.getOutputStream();
		//将输入流中的数据写入到输出流
		int len = -1;
		byte[] buffer = new byte[1024];
		while((len = is.read(buffer)) != -1) 
		{
			os.write(buffer, 0, len);
		}
		//关闭流
		os.close();
		is.close();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值