菜鸟程序猿之使用时间戳命名文件遇到的坑

问题描述:

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

产生原因:

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

解决方法:

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

猜你喜欢

转载自blog.csdn.net/yxh13521338301/article/details/88352751