如果希望防止用户上传的图片重复,你可以将历史图片的MD5值存储在数据库中或者在文件系统中,以便在用户上传新图片时进行比对。
具体存储位置有以下几种常见的方式:
-
数据库存储:您可以在数据库中创建一个表来存储图片的MD5值,每次用户上传新图片时,先计算该图片的MD5值,然后与数据库中已有的MD5值进行比对。
-
文件系统存储:您也可以将历史图片的MD5值直接存储在文件系统中,比如创建一个特定的文件,每行存储一个图片的MD5值,每次上传新图片时,读取该文件进行比对。
-
缓存存储:如果您不需要长期存储历史图片的MD5值,可以使用缓存来暂时存储,比如使用Redis等缓存数据库存储MD5值,并设置合适的过期时间。
无论选择哪种方式,确保能够高效地检索历史图片的MD5值,并与新上传图片的MD5值进行对比,以达到防止用户上传重复图片的目的。
/**
* 图片文件上传
*/
@Autowired
private StringRedisTemplate redisTemplate;
@PostMapping(value = "/imageUpload", name = "图片文件上传")
public R imageUpload(MultipartFile file) {
if (file.isEmpty()) {
return R.error("上传异常");
}
try {
// 计算上传图片的MD5值
String md5 = calculateMD5(file);
// 检查Redis中是否存在该MD5值
Boolean exist = redisTemplate.opsForValue().setIfAbsent(md5, "1");
if (exist != null && exist) {
// 说明MD5值不存在,可以上传
campusFileService.fileUploadImage(file);
return R.ok("图片上传成功");
} else {
return R.error("图片已存在,不能重复上传");
}
} catch (Exception e) {
e.printStackTrace();
return R.error("上传异常");
}
}
private String calculateMD5(MultipartFile file) throws IOException {
byte[] bytes = file.getBytes();
return DigestUtil.md5Hex(bytes);
}
解释一下关键代码,redis判断的
当用户上传图片时,您可以在 `imageUpload` 方法中加入对图片的 MD5 值进行检查,并利用 Redis 实现判断是否重复上传的功能。下面是您提供的代码片段的解释:
```java
Boolean exist = redisTemplate.opsForValue().setIfAbsent(md5, "1");
```
1. `redisTemplate`:这是您通过 Spring 注入的 `StringRedisTemplate` 实例,用于与 Redis 进行交互。
2. `opsForValue()`:`redisTemplate` 的 `opsForValue()` 方法返回一个用于操作存储在 Redis 中简单值(即字符串)的对象。
3. `setIfAbsent(md5, "1")`:`setIfAbsent` 方法尝试将给定的 `md5` 键和 `1` 值存储在 Redis 中,但只有在该键不存在的情况下才会成功设置值。如果已经存在相同的键,则该方法不会设置新值并返回 `false`。
4. `exist`:`exist` 是一个布尔值,表示存储该 MD5 值是否成功。如果返回 `true`,则表示该 MD5 值之前不存在,可以上传当前的图片;如果返回 `false`,则表示该 MD5 值已经存在,不允许重复上传同一张图片。
通过使用 `setIfAbsent` 方法,您可以实现在 Redis 中存储图片的 MD5 值,并通过判断是否已存在来控制图片重复上传的情况。这样可以确保不会重复存储相同的图片,提高系统的效率和节约存储空间。
如果您有任何其他问题或需要进一步解释,请随时告诉我。