java web上传文件和下载文件代码片段分享
作者:夏诗鸢 发布时间:2023-10-04 19:50:50
标签:java,web,上传文件,下载文件
本文实例为大家分享了java web上传文件和下载文件的具体代码,供大家参考,具体内容如下
/**
* Purpose:上传文档
*
* @param req
* @param fileTitle
* @param fileType
* @param fileDesc
* @return
*/
@RequestMapping("upload")
public ModelAndView upload(HttpServletRequest req, String fileType, String fileDesc, String share) {
UserAllInfo userAll = (UserAllInfo) req.getSession().getAttribute("userAll");
ModelAndView mav = new ModelAndView();
// 获取文件的大小
String fileSize = "";
int length = req.getContentLength();
//转换成KB
double len1 = (double) (Math.round((length / 1024) * 100)) / 100;
//转换成MB
double len2 = (double) (Math.round((len1 / 1024) * 100)) / 100;
if (len2 > 1) {
fileSize = String.valueOf(len2) + "MB";
} else {
fileSize = String.valueOf(len1) + "KB";
}
//将请求转换成处理文件的请求
MultipartRequest mreq = (MultipartRequest) req;
//文件上传专用类
MultipartFile mfile = mreq.getFile("uploadFile");
// 得到上下文路径
String root = req.getSession().getServletContext().getRealPath("/");
File dir = new File(root);
// 获取文件名和文件的mime类型
String str = mfile.getOriginalFilename();
String[] st = str.split("\\.");
File savedFile = null;
try {
//在指定目录中创建一个新的空文件,文件名称加前缀"upload_"
savedFile = File.createTempFile("upload_", mfile.getOriginalFilename(), dir);
//将缓冲区的内容复制到新创建的文件中
FileCopyUtils.copy(mfile.getInputStream(), new FileOutputStream(savedFile));
} catch (Exception e) {
e.printStackTrace();
}
String path = savedFile.getPath();
// 将文件的信息封装在对象中
FileInfo file = new FileInfo();
if (userAll != null) {
file.setUploadPersonId(userAll.getUser().getUserId());
} else {
mav.setViewName("login");
return mav;
}
file.setFileName(st[0]);
file.setFilePath(path);
Date date = new Date();
file.setUploadDate(date);
file.setFileSize(fileSize);
file.setFileType(fileType);
file.setFileForm(st[1]);
if ("superman".equals(userAll.getUser().getUserNumber())) {
file.setFileShare("Y");
file.setCheckFlag("Y");
} else {
file.setFileShare(share);
file.setCheckFlag("N");
}
file.setDeleteFlag("N");
file.setDownloadTimes(0);
// 保存文件的信息
boolean bool = fileSer.saveFile(file);
String userNumber = userAll.getUser().getUserNumber();
//设置跳转界面
mav.setViewName("jsp/person/upload");
logSer.saveLog("用户\"" + userNumber + "\"上传文件\"" + file.getFileName() + "\"");
mav.getModel().put("bool", bool);
return mav;
}
/**
* Purpose:下载文档
*
* @param fileId 文件id
* @return
*/
@RequestMapping("download")
public void download(Integer fileId, HttpServletResponse resp) {
FileInfo file = new FileInfo();
//通过文件id获取文件的基本信息
file = fileSer.getFileById(fileId);
// 根据文件后缀名设置文件的mime类型
String mime = "application/";
switch (file.getFileForm()) {
case "doc":
mime = mime + "msword";
break;
case "docx":
mime = mime + "msword";
break;
case "pdf":
mime = mime + "pdf";
break;
case "xls":
mime = mime + "vnd.ms-excel";
case "ppt":
mime = mime + "vnd.ms-powerpoint";
break;
case "txt":
mime = "text/plain";
break;
default:
break;
}
resp.setContentType(mime);
String fileName = file.getFileName();
String name = "";
try {
// 将文件名使用utf-8编码格式编码,使其中的中文字符可以正常显示
name = URLEncoder.encode(fileName, "utf-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
// 弹框选择保存路径
resp.setHeader("content-disposition", "attachment;filename=" + name + "." + file.getFileForm()
+ ";filename*=utf-8''" + name + "." + file.getFileForm());
String filePath = file.getFilePath();
InputStream is = null;
OutputStream os = null;
try {
is = new BufferedInputStream(new FileInputStream(filePath));
os = new BufferedOutputStream(resp.getOutputStream());
byte[] buff = new byte[1024];
@SuppressWarnings("unused")
int count;
while ((count = is.read(buff)) != -1) {
os.write(buff);
}
//修改下载次数
fileSer.update(fileId);
} catch (Exception e) {
e.printStackTrace();
} finally {
//最后,要记得关闭输入流和输出流
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
0
投稿
猜你喜欢
- mybatis的trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“val
- jdk1.8中的for循环jdk1.8 从语法角度,感觉发生的变化还是蛮大的。在此记录一下。for 循环 public stati
- 整合Spring Data JPAJPA (Java Persistence API)和 Spring Data 是两个范畴的概念。Hibe
- 最近一直在对接接口,上游返回的都是 JSON 数据,我们需要将这些数据进行保存,我们可以解析成 Map 通过 key 的方式进行获取,然后
- 本文实现android系统照相机的调用来拍照项目的布局相当简单,只有一个Button:<RelativeLayout xmlns:an
- 本文介绍了android视频截屏&手机录屏实现代码,分享给大家,希望对大家有帮助问题在android中有时候我们需要对屏幕进行截屏操
- 本文实例讲述了Java基于Runtime调用外部程序出现阻塞的解决方法, 是一个很实用的技巧。分享给大家供大家参考。具体分析如下:有时候在j
- 前言Springboot应用在启动的时候分为两步:首先生成 SpringApplication 对象 ,运行 SpringApplicati
- C#处理猜拳问题的简单实例(非窗体)//猜拳,5局3胜,要求使用公用变量。namespace 结构体复习_公用变量{class Progra
- 我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目前有多个监控工具, 相比JProfiler对系统资源尤其
- 这篇文章主要介绍了SpringBoot使用Log4j过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- spring boot2集成activiti6踩过的坑1.activiti中的mybaitis版本冲突 错误信息Caused by: jav
- 先看MVC模式流程图(其实MVC设计模式就是java中的model2。): &nb
- 一、问题描述有时候,我们会遇到在遍历List集合的过程中删除数据的情况。看着自己写的代码,感觉完全没有问题,但就是达不到预期的效果,这是为什
- springboot集成redission及分布式锁的使用1、引入jar包<dependency> &
- 一、整合原理activiti的配置文件本身就是一个spring的配置文件,但默认情况下只讲ProcessEngineConfiguratio
- 本文实例讲述了Java单例模式。分享给大家供大家参考,具体如下:在实际开发的时候会有一些需求,在某个类中只能允许同时存在一个对象。这时就需要
- 将JavaDoc 注释 生成API文档1. 打开java代码,编写JavaDoc 注释,只有按照java的规范编写注释,才能很好的生成API
- Token 一定要放在请求头中吗? 答案肯定是否定的,本文将从源码的角度来分享一下 spring security oauth2 的解析过程
- Maven打包时指定启动类使用Maven打包的时候, 有时候需要指定启动类, 可如下操作!测试项目(结构如下):代码: com.xxx.Ma