request实现文件上传下载

文件上传

1.文件上传三要素

        1)表单提交方式为post

        2)表单中需要有<input type=”file”>元素,需要有name属性和值。

        3)表单中设置enctype=”multipart/form-data”

<h1>文件上传</h1>
<form action="" method="post" enctype="multipart/form-data">
	文件描述:<input type="text" name="info"><br /> 
	文件上传:<input type="file" name="upload"><br /> <input type="submit" value="上传" />
</form>

2.导入fileupload的jar包

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

3.编写文件上传的servlet(在wabapp下创建好upload文件夹)

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

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 FileUploadServlet extends HttpServlet {

	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) {
		//创建文件磁盘工厂
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
		//创建Servlet解析类
		ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
		
		try {
			//获取request的请求(包括普通项和文件上传项)
			List<FileItem> list = fileUpload.parseRequest(request);
			//遍历集合
			for (FileItem fileItem : list) {
				//判断是否为表单项(即非文件上传项)
				if (fileItem.isFormField()) {
					//获取参数名
					String ParameterName = fileItem.getFieldName();
					//获取参数值
					String ParameterValue = fileItem.getString("UTF-8");
					System.out.println(ParameterName + " : " + ParameterValue);
				} else {//是文件上传项
					//获取文件名
					String fileName = fileItem.getName();
					//获取文件内容
					InputStream fileContent = fileItem.getInputStream();
					//将文件内容写入磁盘	
					String realPath = getServletContext().getRealPath("/upload");//获取要传入文件夹磁盘的绝对路径
					OutputStream os = new FileOutputStream(realPath + "/" + fileName);
					int len = 0;
					byte[] b = new byte[1024];
					while ((len = fileContent.read(b)) != -1) {
						os.write(b, 0, len);
					}
					fileContent.close();
					os.close();
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) {
		doGet(request, response);
	}

4.在web.xml文件中配置servlet,并设置好请求路径

<servlet>
    <description></description>
    <display-name>FileUploadServlet</display-name>
    <servlet-name>FileUploadServlet</servlet-name>
    <servlet-class>com.cz.servlet.FileUploadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>FileUploadServlet</servlet-name>
    <url-pattern>/FileUploadServlet</url-pattern>
  </servlet-mapping>

5.运行工程,上传文件,如图效果

看到控制台结果如下

刷新工程,upload路径下多了一个文件

文件下载

文件下载有两种方式:

1.通过超链接下载:<a href=”资源路径”></a>,但是如果浏览器支持显示这种数据格式就不会提示下载了

2.通过代码的方式实现文件下载,主要是要设置两个头,并且使用response对象的getOutputStream()获取

输出流向客户端写数据。

Content-Type  :文件的MIME的类型

Content-Disposition  :浏览器支持该格式的文件,提示下载

下面是通过代码方式实现文件下载:

public class FileDownload extends HttpServlet {

	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1.接收参数:
		String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"), "UTF-8");
		// 2.下载:设置两个头和一个流
		// 设置Content-Type
		String type = getServletContext().getMimeType(filename);
		response.setContentType(type);
		// 定义一个代表该文件的路径:
		String path = getServletContext().getRealPath("/download");
		File file = new File(path + "/" + filename);
		// 判断浏览器的类型:
		String agent = request.getHeader("User-Agent");
		if (agent.contains("Firefox")) {
			// 使用的是Firefox
			filename = DownloadUtils.base64EncodeFileName(filename);
		} else {
			// IE或者其他的浏览器
			filename = URLEncoder.encode(filename, "UTF-8");
		}

		// 设置Content-Disposition
		response.setHeader("Content-Disposition", "attachment;filename=" + filename);
		// 设置一个代表了文件的输入流
		InputStream is = new FileInputStream(file);
		OutputStream os = response.getOutputStream();
		// 两个流对接:
		int len = 0;
		byte[] b = new byte[1024];
		while ((len = is.read(b)) != -1) {
			os.write(b, 0, len);
		}
		is.close();
	}

	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

配置servlet

<servlet>
    <description></description>
    <display-name>FileDownloadServlet</display-name>
    <servlet-name>FileDownloadServlet</servlet-name>
    <servlet-class>com.cz.servlet.FileDownloadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>FileDownloadServlet</servlet-name>
    <url-pattern>/FileDownloadServlet</url-pattern>
  </servlet-mapping>

启动工程,前端发送.../FileDownloadServlet?filename=xxx.jpg就可以了

猜你喜欢

转载自blog.csdn.net/u010689849/article/details/83754753