Java中文件的上传与下载和提取为工具类

Java原生代码实现文件的上传与下载:

这是代码中需要使用到的包:

抽取成工具类的代码如下:

package cn._02upload;

import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

public class UploadUtil {
	//设置指定的文件格式
	private static String[] arr = {"jpg","png","bmp","jif"};
	public static void upload(HttpServletRequest req,Map<String,String> map) {
		//检查是否有文件上传请求
		boolean ismultipart = ServletFileUpload.isMultipartContent(req);
		if(ismultipart) {
			try {
				//为基于磁盘的文件创建工厂
				DiskFileItemFactory factory = new DiskFileItemFactory();
				//设置缓存大小
				factory.setSizeThreshold(1024*100*5);
				//设置临时目录 文件上传完成以后就会删除
				factory.setRepository(new File("C:/temp"));
				//创建一个新的文件上传处理程序
				ServletFileUpload upload = new ServletFileUpload(factory);
				//设置上传文件的单个大小
				upload.setFileSizeMax(1024*1024*4);
				//解析请求
				List<FileItem> items = upload.parseRequest(req);
				for (FileItem fileItem : items) {
					//处理普通字段
					if(fileItem.isFormField()) {
						//把字段装进map中
						map.put(fileItem.getFieldName(), fileItem.getString("UTF-8"));
					}else {
						//定义上传文件的路径
						String realPath = req.getServletContext().getRealPath("/upload");
						//文件重命名
						//获取文件的后缀名
						String extension = FilenameUtils.getExtension(fileItem.getName());
						List<String> asList = Arrays.asList(arr);
						if(!asList.contains(extension)) {
							//抛异常
							throw new Exception("请上传指定文件格式");
						}
						String filename = String.valueOf(System.currentTimeMillis());
						map.put(fileItem.getFieldName(), filename+"."+extension);
						//处理文件
						File file = new File(realPath,filename+"."+extension);
						//判断文件夹是否存在
						if(!file.getParentFile().exists()) {
							file.getParentFile().mkdirs();
						}
						//把上传的数据写到指定文件夹中
						fileItem.write(file);
					}
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}			
		}
	}
}

这上面的代码注解写的很详细的了,注意配置好前台页面

如下:这是前台的页面

<form action="/a/reg" method="post" enctype="multipart/form-data">
		用户名:<input type="text" name="username" ><br>
		年龄:<input type="text" name="age" ><br>
		头像:<input type="file" name="img" ><br>
		<input type="submit" value="提交">
</form>

form表单中的需要配置enctype,其中的默认值为application/x-www-form-urlencoded,这种格式不支持文件的传输所以需要改为

multipart/form-data,这种格式不会对字符进行编码,所以我们再获取字段的时候需要手动设置编码集,不然会出现乱码情况

//把字段装进map中
map.put(fileItem.getFieldName(), fileItem.getString("UTF-8"));

文件的下载

代码如下:

package cn._03download;

import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/download")
public class DowenLoadServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到文件名
		String filename = req.getParameter("name");
		System.out.println(filename);
		//得到文件的真实路径
		String realPath = super.getServletContext().getRealPath("/download");
		//拿到要下载的文件
		File file = new File(realPath,filename);
		//告诉浏览器文件下载,而不是直接打开(IE6直接打开)
		resp.setContentType("application/x-msdownload");// text/html;charset=utf-8
		//获取请求头中浏览器版本
		String header = req.getHeader("User-Agent");
		//MSIE----IE的浏览器标识
		if(header.contains("MSIE")) {
			filename = URLEncoder.encode(filename,"UTF-8");
		}else {
			new String(filename.getBytes("UTF-8"),"ISO-8859-1");
		}
		//下载的内容的名字问题
		resp.setHeader("Content-Disposition","attachment; filename="+filename);
		//将文件下载到本地
		//两个参数:第一个参数相当于拿到程序中的真实文件 第二个参数拿到我们的响应输出流 然后通过流将文件从程序拷备到客户端
		Files.copy(Paths.get(file.getAbsolutePath()), resp.getOutputStream());
		
	}
}

值得注意的时IE浏览器的配置了,需要对IE浏览器进行单独的判断

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值