网站首页 > 资源文章 正文
文件上传是每个项目都会用到的基础功能,这里讲解下实现过程和一些最佳实践
接收方式
后台如何接收前台传过来的文件呢?其实很简单,用MultipartFile就能接收
@PostMapping("file")
@ApiOperation(value = "上传文件")
public Result uploadFile(@RequestParam("file") MultipartFile file) {
return resultOk(uploadService.upload(file));
}
保存文件
接收到文件后就需要保存文件到服务器了,直接调用MultipartFile的transferTo方法就能保存,没啥难度,关键是如果指定保存目录。很多人喜欢用当前日期来生成目录保存文件,比如生成一个名为20210810的目录。这种方式有个不好的地方就是文件不均衡,可能有的目录有很多文件,有的目录却没有文件。
一个目录放入太多文件会造成检索缓慢,我们生活中应该有这样的经验,当打开一个文件超多的目录鼠标会显示加载中,过好一会才能看到文件。
那如何才能均衡的存放文件呢?
可以随机生成一个2字节整数,16进制最小为0x0000,最大为0xFFFF,可以把低位作为一级文件名,高位作为二级文件名,比如文件名为ff/ff,这样如果每个文件夹保存256个文件的话,理论可以均衡保存1600万个文件。
如果想均衡保存更多文件咋办?那就取4字节,最大为0xFFFFFFFF,生成4层目录,可均衡保存万亿个文件。当然这么大数量的文件已经不推荐单机保存了,需要考虑HDFS或者OSS。
public String upload(MultipartFile file) {
try {
//获取原始文件名
String originalName = file.getOriginalFilename();
//获取原始文件后缀
String extension = FileUtils.getExtention(originalName);
//生成新的文件名,保留原有后缀
String fileName = UUIDUtils.getUUID() + "." + extension;
int pathCode = RandomUtils.nextInt(65535);
//取低位1字节
int v = pathCode & 0xFF;
//取次低位1字节
int h = pathCode >> 8 & 0xFF;
String relativeDir = HexUtils.bytesToHexString((byte) v).toLowerCase() + "/" + HexUtils.bytesToHexString((byte) h).toLowerCase() + "/";
File dir = new File(systemConfig.getUploadPath() + relativeDir);
if (!dir.exists()) {
dir.mkdirs();
}
File saveFile = new File(dir, fileName);
file.transferTo(saveFile);
return systemConfig.getFileBaseUrl() + "file/" + relativeDir + fileName;
} catch (IOException e) {
throw new ServiceFailException("上传文件失败", e);
}
}
保存展示
?
支持URL访问
这个时候虽然保存成功了,但是无法通过URL访问,因为没建立资源的映射关系,下面的uploadPath是本地文件保存路径
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private SystemConfig systemConfig;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//定义静态资源路径
registry.addResourceHandler("/file/**").addResourceLocations("file:" + systemConfig.getUploadPath());
}
}
url演示
?
文件上传大小限制
SpringBoot默认上传文件大小限制为1MB,这个肯定不够的,需要在配置文件里改下
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
参考项目(模块: SpringBoot-HelloWorld): https://gitee.com/huatin/java-test
?
猜你喜欢
- 2024-09-27 Angelababy靠着黄晓明上位 狠甩陈伟霆踢走李菲儿
- 2024-09-27 “回归”EXO,TAO第二波预告公开“扑通扑通”
- 2024-09-27 王者归来!EXO新专“好热”!新一轮头脑风暴开启,行星饭们准备好了没
- 2024-09-27 EXO今晚特别直播节目,不见不散!(exo今晚特别直播节目,不见不散是哪一期)
- 2024-09-27 EXO成员伯贤重归SNS 引粉丝沸腾(伯贤pla)
- 2024-09-27 All Kill只需一小时,【EXO】强势回归攻占音源榜单
- 2024-09-27 白玫瑰是破案关键,下一个是张艺兴预告?吴世勋不剧透可能会憋坏
- 2024-09-27 【EXODUS】10人EXO大势回归(exo全体人员)
- 2024-09-27 「EXO」「新闻」180804 有啥是她们做不到的 迎接EXO-L出道四周年特别企划来袭
- 2024-09-27 EXO《EXODUS》预告 张艺兴lay变身治愈系暖男
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)