java上传文件和下载文件有很多种,我只介绍两种:一是io流,二是springmvc,本人更喜欢用springmvc的方式,因为更加简单
一io流,需要导入comment.io,和comment.beabuty两个jar
以jsp+servert为例直接上代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Part;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;@MultipartConfig
public class FileServlet extends HttpServlet { /**
*
*/
private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 获取请求参数: 区分不同的操作类型
String method = request.getParameter("method");
if ("upload".equals(method)) {
// 上传
upload(request,response);
} else if ("downList".equals(method)) {
// 进入下载列表
downList(request,response);
} else if ("down".equals(method)) {
// 下载
down(request,response);
}
} /**
* 1. 上传
*/
private void upload(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { HttpSession session=request.getSession();
List<String> list=(List<String>)session.getAttribute("files");
if(list==null){
//如果集合为空,就创建一个集合
list=new ArrayList<String>();
}
try {
//获取文件描述信息
String desc=request.getParameter("desc");
//获取上传的文件
Part part=request.getPart("file");
//获取请求的信息
String name=part.getHeader("content-disposition");
//System.out.println(name);//测试使用
//System.out.println(desc);//
//获取上传文件的目录
String root=request.getServletContext().getRealPath("/upload");
System.out.println("测试上传文件的路径:"+root);
//获取文件的后缀
String str=name.substring(name.lastIndexOf("."), name.length()-1);
System.out.println("测试获取文件的后缀:"+str);
//生成一个新的文件名,不重复,数据库存储的就是这个文件名,不重复的
String fname=UUID.randomUUID().toString()+str;
//将文件名保存到集合中
list.add(fname);
//将保存在集合中的文件名保存到域中
session.setAttribute("files", list);
String filename=root+"\\"+fname;
System.out.println("测试产生新的文件名:"+filename);
//上传文件到指定目录,不想上传文件就不调用这个
part.write(filename);
request.setAttribute("info", "上传文件成功");
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("info", "上传文件失败");
}
String mainPage = "upload.jsp";
request.setAttribute("mainPage", mainPage);
RequestDispatcher dispatcher = request.getRequestDispatcher("main.jsp");
dispatcher.forward(request, response); }
/**
* 2. 进入下载列表
*/
private void downList(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 实现思路:先获取upload目录下所有文件的文件名,再保存;跳转到down.jsp列表展示
//1. 初始化map集合Map<包含唯一标记的文件名, 简短文件名> ;
Map<String,String> fileNames = new HashMap<String,String>(); //2. 获取上传目录,及其下所有的文件的文件名
String bathPath = getServletContext().getRealPath("/upload");
// 目录
File file = new File(bathPath);
// 目录下,所有文件名
String list[] = file.list();
// 遍历,封装
if (list != null && list.length > 0){
for (int i=0; i<list.length; i++){
// 全名
String fileName = list[i];
// 短名
String shortName = fileName.substring(fileName.lastIndexOf("#")+1);
// 封装
fileNames.put(fileName, shortName);
}
} // 3. 保存到request域
request.setAttribute("fileNames", fileNames);
// 4. 转发
String mainPage = "downlist.jsp";
request.setAttribute("mainPage", mainPage);
RequestDispatcher dispatcher = request.getRequestDispatcher("main.jsp");
dispatcher.forward(request, response); }
/**
* 3. 处理下载
*/
private void down(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 获取用户下载的文件名称(url地址后追加数据,get)
String fileName = request.getParameter("fileName");
fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8"); // 先获取上传目录路径
String basePath = getServletContext().getRealPath("/upload");
// 获取一个文件流
InputStream in = new FileInputStream(new File(basePath,fileName)); // 如果文件名是中文,需要进行url编码
fileName = URLEncoder.encode(fileName, "UTF-8");
// 设置下载的响应头
response.setHeader("content-disposition", "attachment;fileName=" + fileName); // 获取response字节流
OutputStream out = response.getOutputStream();
byte[] b = new byte[1024];
int len = -1;
while ((len = in.read(b)) != -1){
out.write(b, 0, len);
}
// 关闭
out.close();
in.close(); }
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}}
原理不多说了,就是通过读取http请求中的信息流,在cope到本地实现的
二springmvc方式实现就更加简单了,也直接上代码:
import com.xiaomin.qq.enums.ResponseEnum;
import com.xiaomin.qq.vo.ResponseVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;import java.io.*;
import java.math.BigDecimal;/**
* @Author 无名小卒
* @Date 2020/6/11 2:41
* @Version 1.0
*/@Slf4j
public class FileUtil {
/**
* * 获取文件大小
* *
* * @param size
* * @return
*
*/
public static String getPrintSize(long bytes) { BigDecimal filesize = new BigDecimal(bytes);
BigDecimal megabyte = new BigDecimal(1024 * 1024); float returnValue = filesize.divide(megabyte, 2, BigDecimal.ROUND_UP).floatValue();
if (returnValue > 1) {
return (returnValue + "MB");
}
BigDecimal kilobyte = new BigDecimal(1024);
returnValue = filesize.divide(kilobyte, 2, BigDecimal.ROUND_UP).floatValue();
return (returnValue + "KB");
} /*上传文件*/
public static ResponseVo<Object> uploadFile(MultipartFile file, String newfileName) {
if (file.isEmpty()) {
return ResponseVo.error(ResponseEnum.ERROR);
}
try {
/*旧文件名*/
String fileName = file.getOriginalFilename();
/*文件存储的位置*/
String filePath = "D://upload//";
// 获取文件的拓展名
String extension = "." + FilenameUtils.getExtension(fileName);
/*获取文件类型*/
String type = file.getContentType();
/*获取文件大小*/
long size = file.getSize();
/*新文件名*/ File dest = new File(filePath + newfileName);
/*上传文件*/
file.transferTo(dest);
} catch (IOException e) {
log.error(e.toString(), e);
}
return ResponseVo.success(ResponseEnum.REQUESTER_SUCCESS); }
/*下载文件*/
public static ResponseEntity<Object> downloadFile(String fileName) {
String filePath = "D://upload//";
File file = new File(filePath + fileName);
InputStreamResource resource = null;
try {
resource = new InputStreamResource(new FileInputStream((file)));
} catch (FileNotFoundException e) {
log.error(e.toString(), e);
}
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", String.format("attachment;filename=\"%s\"", file.getName()));
headers.add("Cache-Control", "no-cache,no-store,must-revalidate");
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
ResponseEntity<Object> responseEntity = ResponseEntity.ok()
.headers(headers)
.contentLength(file.length())
.contentType(MediaType.parseMediaType("application/text"))
.body(resource);
return responseEntity;
} /*删除文件*/
public static ResponseVo deleleFile(String fileName) {
//根据文件夹获取此文件夹的真实路径既是绝对路径
String realPath = "D://upload//";
//打印看一下绝对路径是否有误
System.out.println(realPath);
//根据文件的路径获取此文件
File file = new File(realPath + "/" + fileName);
//判断此文件是否为空
if (file != null) {
//文件不为空,执行删除
file.delete();
return ResponseVo.success(ResponseEnum.REQUESTER_SUCCESS);
} else {
//为空提示错误信息
return ResponseVo.error(ResponseEnum.ERROR);
} }
}
参考文章:http://blog.ncmem.com/wordpress/2023/12/12/java文件上传和下载的方式/