使用时间戳命名文件遇到的坑

问题描述:

最近写了一个文件上传的接口,从流中读出文件,将其保存成指定的文件类型,文件名以当前系统的时间戳命名。写完自测,没有问题,
就提交代码了。但是今天测试的同事反馈,有个业务需要上传多张图片,当图片很小时,会出现问题(图片无法打开,或多个请求返回的
图片名称相同),经过反复调试分析,找到原因。

产生原因:

上传多次图片时,调用方使用多线程来处理,这样就会在同一节点请求接口,当文件特别小的时候,程序读取速度很快,导致获取文件
名会重复,如果第一个请求处理完,生成一个图片路径,第二个请求完发现此路径已存在,就会将其覆盖,这样会出现多张图片相同的
情况;如果第一个请求在生成图片过程中,第二个请求也开始生成图片,就会导致两个流向一个文件输入,最后生成图片,导致这个图
片损坏不可访问,出现多张图片都不显示的问题。

解决方法:

1.文件名不使用System.currentTimeMillis(),改为System.nanoTime()。毫秒级可能会产生请求并发,纳秒级存在的可能性为0
2.文件名使用UUID。文件名可能有点长
3.使用锁机制。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值