javaee之文件上传下载练习

文件上传:
文件上传在特定的页面需求中有所特定,一般的开发步骤:
1)在提供上传的特定页面中,表单的包含<input type="file" />
2)表单提交必须使用POST方式提交
3)修改表单的enctype属性,用于修改content-type,影响请求正文的内容,当一个页面有了文件上传的属性以后,普通表单的数据也会变成正文内容,不是键值对了
修改为:enctype="multipart/form-data"




解析文件上传:
1)创建DiskFileItemFactory对象,用于设置缓存配置
2)创建ServletFileUpload对象,用于解析文件
List<FileItem> parseRequest(request) 用于解析所有上传的文件内容


FileItem:代表的是一个上传的文件相关信息
getName()  获取文件的名称
getContentType()  获取文件的类型
getSize()  获取文件的大小
getInputStream()  获取的是文件的内容
3)使用FileUtils的copyXXX方法把数据写出

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
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;
import org.apache.commons.io.FileUtils;

public class demo1 extends HttpServlet {

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

		//在文件的上传中,首先创建DiskFileItemFactory对象,可以无参,也可以有参
		/*
		 * 也可以创建DiskFileItemFactory有参的对象,表示创建带内存大小的缓存配置,
		 * 参数一:表示设置的缓存打下
		 * 参数二:表示超过缓存时存入的文件
		 */
		//DiskFileItemFactory ds = new DiskFileItemFactory();
		DiskFileItemFactory ds = new DiskFileItemFactory(1*1024*1024,new File("c:/"));
		
		//创建ServletFileUpload对象,传入DiskFileItemFactory对象
		ServletFileUpload sfu = new ServletFileUpload(ds);
		
		
		try {
			//在ServletFileUpload对象的parseRequest能够得到FileItem的数据,里面包括文件也包括其他的数据
			List<FileItem> items = sfu.parseRequest(request);
			
			/*得到一个文件上传的内容
			 * FileItem item = items.get(0);
			System.out.println(item.getName());
			System.out.println(item.getContentType());
			System.out.println(item.getSize());*/
			
			//遍历得到所有需要提交的数据
			for(FileItem item1 : items){
				System.out.println(item1.getName());
				System.out.println(item1.getContentType());
				System.out.println(item1.getSize());
				
				FileUtils.copyInputStreamToFile(item1.getInputStream(), new File("c:/"));
			
				//写完以后再缓存区中删除缓存数据
				item1.delete();
			}
			
			
			//把文件上传的数据通过变成字节码文件,写到第二参数的位置
			//FileUtils.copyInputStreamToFile(item.getInputStream(), new File("c:/"));
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
		
	}

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

		doGet(request, response);
	}

}

import java.io.File;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
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.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;

public class demo2 extends HttpServlet {

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

		DiskFileItemFactory ds = new DiskFileItemFactory();
		ServletFileUpload sfu = new ServletFileUpload(ds);
		
		sfu.setFileSizeMax(2*1024*1024);  //表示一个文件上传的最大值
		sfu.setSizeMax(4*1024*1024);  //表示文件一次性上传的最大值
		
		
		try{
			List<FileItem> items = sfu.parseRequest(request);
			if(items != null && items.equals("")){
			for(FileItem item : items){
				if(item.isFormField()){  //判断是否为普通表单的数据,普通表单数据通过getString方法输出
					System.out.println(item.getString("utf-8"));
				}else{
					/**
					 * 限制文件类型
					 */
					String contentType = item.getContentType();
					//只能上传图片:  image/xxxx 
					if(!contentType.matches("image/[a-zA-Z0-9]+")){
						//不允许的类型
						request.setAttribute("msg", "不支持该类型:"+contentType);
						request.getRequestDispatcher("/upload3.jsp").forward(request, response);
						return;
					}
					
					System.out.println(item.getName());
					System.out.println(item.getContentType());
					System.out.println(item.getInputStream());
					
					FileUtils.copyInputStreamToFile(item.getInputStream(), new File("c:/"));
				}
				
			}
		  }	
		}catch(FileSizeLimitExceededException e){
			request.setAttribute("msg", "每个文件不能超过200kb大小");
			request.getRequestDispatcher("/upload.jsp").forward(request, response);
			return;
		}catch(SizeLimitExceededException  e){
			request.setAttribute("msg", "一次性的总文件不能超过400kb大小");
			request.getRequestDispatcher("/upload.jsp").forward(request, response);
			return;
		}catch(Exception e){
		
			e.printStackTrace();
		}
	}

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

		doGet(request, response);
	}

}

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'demo3.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <form action="<c:url value='/demo3' />" method="post" enctype="multipart/form-data">
    	文件上传:<input type="file" name="attach" />
    	<br /><input type="submit" value="上传" />
    </form>
  </body>
</html>



文件的下载
1)读取所需要下载的文件路径
2)通知浏览器提示一个下载框,设置响应头:content-disposition  为 attachment;filename=XXX
3)在把文件的内容输出

import java.io.File;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

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

//文件 的下载
public class demo3 extends HttpServlet {

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

		//首先得到文件的路径
		String path = this.getServletContext().getRealPath("/images/1.jpg");
		File file = new File(path);
		FileInputStream in = new FileInputStream(file);
		
		//在设置响应头为下载
		response.setHeader("content-disposition", "attachment;filename="+file.getName());
		
		//然后在浏览器弹出下载框进行下载
		OutputStream out = response.getOutputStream();
		byte[] b = new byte[1024];
		int len = 0;
		while((len = in.read())!= -1 ){
			out.write(b, 0, len);
		}
	}

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

		doGet(request, response);
	}

}

这两个功能也算是Servlet技术的辅助功能,在一些特定的需求下可以使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值