javaWeb之文件的上传与下载

先导入相应的jar包
commons-fileupload-1.2.1.jar
commons-io-2.0.jar

上传页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form  enctype="multipart/form-data" action="${pageContext.request.contextPath}/FileUploadController" method="post">
	<input type= "file"  name ="filetext"/>
	<br><br>
	请输入你上传文件的描述:<input type="text" name="dec"/>
	<br><br>
	<input type="submit" value="上传"/>
	
	</form>
</body>
</html>

上传文件的代码

package bzu.cn.fileloadtest.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet("/FileUploadController")
public class FileUploadController extends HttpServlet {
	private static final long serialVersionUID = 1L;

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

	}

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

		doGet(request, response);

		String savePath = request.getSession().getServletContext().getRealPath("/WEB-INF/final");
		System.out.println(savePath);
		// 得到保存文件的临时目录
		String tempPath = request.getSession().getServletContext().getRealPath("/WEB-INF/temp");
		System.out.println(tempPath);
		// 创建保存文件的临时位置
		File tempFile = new File(tempPath);
		// 判断文件是否存在
		if (!tempFile.exists()) {
			tempFile.mkdirs();
		}
		// 创键一个工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		// 设置工厂的属性,设置最大的接收文件的大小时100KB
		factory.setSizeThreshold(100 * 1024);
		// 设置保存文件的临时位置
		factory.setRepository(tempFile);
		// 创建一个文件上传的解析器
		ServletFileUpload servload = new ServletFileUpload(factory);
		// 设置上传单个文件的大小
		servload.setFileSizeMax(20 * 1024 * 1024);
		// 设置字符编码集
		servload.setHeaderEncoding("UTF-8");
		// 设置文件总打大小
		servload.setSizeMax(40 * 1024 * 1024);
		servload.setProgressListener(new ProgressListener() {

			@Override
			public void update(long yiuploadFile, long iuploadFile, int arg2) {
				System.out.println("上传的文件大小是" + iuploadFile + "已经上传了" + yiuploadFile);

			}
		});
		// 判断文件上传的编码方式是不是Multipart编码方式
		if (!servload.isMultipartContent(request)) {
			return;
		}
		OutputStream out = null;
		InputStream in = null;
		try {
			List<FileItem> fileItem = servload.parseRequest(request);
			if (fileItem != null && fileItem.size() > 0) {
				for (FileItem f : fileItem) {
					if (f.isFormField()) {
						// 得到普通表单的名字
						String pname = f.getFieldName();

						// 得到普通表单属性中的值
						String value = f.getString("UTF-8");
					} else {
						// 得到上传文件的文件名
						String name = f.getName();
						if (name == null || name.trim().equals("")) {
							continue;
						}
						/*
						 * 注意,在不同的浏览器上的到的名字的格式不一样 在IE浏览器上得到的名字是绝对路径, 在火狐上是文件名 这里需要对name进行一步的该进
						 */
						name = name.substring(name.lastIndexOf("\\") + 1);
						System.out.println(name);
						// 得到上传文件的类型
						String type = f.getContentType();
						// 拿到文件的总大小
						long fileSize = f.getSize();
						String houzui = name.substring(name.lastIndexOf(".") + 1);

						if (houzui.equals("zip") || houzui.equals("rar")) {
							throw new RuntimeException("不能上传压缩文件");
						}
						String saveFileName = makeFileName(name);
						System.out.println(saveFileName);
						String realSavePath = makePath(saveFileName, savePath);
						out = new FileOutputStream(realSavePath + "\\" + saveFileName);
						in = f.getInputStream();

						// 建立缓存区,做一个搬运文件数据流的勺子
						byte[] buffer = new byte[1024];
						int len = 0;
						while ((len = in.read(buffer)) > 0) {
							out.write(buffer, 0, len);
						}
						in.close();
						out.close();
					}
				}
			}
		} catch (FileUploadBase.FileSizeLimitExceededException e) {
			System.out.println("单个文件的大小超过范围");
		} catch (FileUploadBase.SizeLimitExceededException e) {
			System.out.println("总文件的大小超过范围");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			if (in != null)
				in.close();
			if (out != null)
				out.close();
		}
	}

	private String makePath(String saveFileName, String finalPath) {
		int hashCode = saveFileName.hashCode();
		int dir1 = hashCode & 0xf;
		int dir2 = (hashCode >> 4) & 0xf;
		// 用dir1 和dir2 创建新的存储的目录
		String dir = finalPath + "\\" + dir1 + "\\" + dir2;
		File file = new File(dir);
		if (!file.exists()) {
			file.mkdirs();
		}
		System.out.println(dir + "$#^#$^#$^#$%^");
		return dir;
	}

	private String makeFileName(String name) {

		return UUID.randomUUID().toString() + "_" + name;
	}
}

文件的下载

public class LoadServlet extends HttpServlet{
/**
* 载文件,通过OutputStream输出流
*/
public void doPost(HttpServletRequest request,HttpServletResponse response){
//1.获取要下载的文件的绝对路径
String realPath = this.getServletContext().getRealPath("/load/ceshi.txt");
//2.获取要下载的文件名
String fileName = realPath.subString(realPath.lastIndexOf("\\")+1);
String userAgent = request.getHeader("User-Agent");
//针对IE或者以IE为内核的浏览器:
if (userAgent.contains("MSIE")||userAgent.contains("Trident")) {
fileName = java.net.URLEncoder.encode(fileName, "UTF-8");
} else {
//非IE浏览器的处理:
fileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
}
//3.设置content-disposition响应头控制浏览器以下载的方式打开文件
response.setHeader("content-disposition","attachment;filename="+fileName);
//4.获取要下载的文件输入流
InputStream in = new FileInputStream(realPath);

int len = 0;
//5.创建书缓冲区
byte[] buffer = new byte[1024];
//6.通过response对象获取OutputStream输出流对象
OutputStream os = response.getOutputStream();
//7.将FileInputStream流对象写入到buffer缓冲区
while((len=in.read(buffer))>0){
os.write(buffer,0,len);
}
//8.关闭流
in.close();
os.close();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值