update 增强图片文件上传功能修复图片删除bug

master
管理员 1 year ago
parent 96d38ce0a8
commit 294a85abc5

@ -38,7 +38,7 @@
</svg>
</div>
<div v-if="item.url && !props.disabled" @click.stop="item.remove()" class="btn">
<div v-if="item.url && !props.disabled" @click.stop="remove(item)" class="btn">
<svg t="1729755512665" class="icon" viewBox="0 0 1024 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg" p-id="2491" width="200" height="200">
<path
@ -50,6 +50,7 @@
</div>
</slot>
</div>
<el-image-viewer v-if="imgShow" @close="imgShow = false" ref="imgRef"
:url-list="data.map(a => a.url ? getUrl(a.url) : a.preview)" />
</div>
@ -213,11 +214,6 @@ onMounted(async () => {
data.value = mv.value.map(a => ({ url: a }))
}
}
for (let one of data.value) {
one.remove = () => {
remove(one)
}
}
console.debug(proxy.$refs.imgRef)
})
@ -338,7 +334,7 @@ const uploadFiles = async () => {
console.debug('end')
}).finally(() => {
data.value = data.value.filter(a => !a.error && !a.abort)
console.debug('finally')
console.debug('finally',data.value)
doing.value = false
uploading.value = false
})
@ -370,10 +366,6 @@ const uploadFile = async (index, retry = 0) => {
one.uploading.controller.abort()
}
one.remove = () => {
remove(one)
}
let formData = new FormData()

@ -36,7 +36,12 @@ const getUploadKey =async () => {
<li>属性saveSrc是否保存图片原文件如果true则下载时下载原图zip文件否则下载大图片默认false </li>
<li>属性saveMin是否保存缩略图如果true则列表时显示缩略图否则显示大图默认true </li>
<li>属性watermark是否添加水印默认true </li>
<li>属性noEffect是否无效果本质设置css属性默认false </li>
<li>css属性--image-size图片显示大小默认 10em </li>
<li>css属性--image-border-radius图片显示圆角默认 .4em</li>
<li>css属性--image-margin图片外边距默认 .5em .5em 0 0</li>
<li>css属性--image-border图片边框默认 #FFF solid 2px </li>
<li>css属性--image-box-shadow图片阴影默认 0 0 .2em #0005</li>
<li>插槽button上传按钮插槽</li>
<li>插槽default图片列表插槽作用域list不建议定义</li>
<li>事件changemodelValue发送了变化</li>
@ -146,7 +151,7 @@ const { proxy } = getCurrentInstance()
const data = ref(['/files/default/2024/10/24/2nhdirb2ujey/5mb.txt'])
const uploading = ref(false)
const imgs = ref(['/files/default/2024/10/24/f99pkzpyc0bt.webp'])
const imgs = ref(['/files/default/2024/10/24/d0wt3m3j4tud.webp'])
const imging = ref(false)
</script>
<style lang="scss" scoped>

@ -25,7 +25,7 @@ ruoyi:
enable-storage: true # 启用存储
access-key: ${ruoyi.name}
secret-key: ${ruoyi.name}1415926
end-point: http://192.168.3.222:9000/files
end-point: http://192.168.3.222:9000
bucket-name: files
domain: "/files/" # 访问域名,注意“/”结尾例如http://minio.abc.com/abc/
base-path: "" # 基础路径

@ -7,6 +7,7 @@ import com.ruoyi.TestSuper;
import com.ruoyi.file.FileService;
import lombok.NoArgsConstructor;
import lombok.SneakyThrows;
import org.dromara.x.file.storage.core.Downloader;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.FileStorageService;
import org.dromara.x.file.storage.core.tika.TikaFactory;
@ -41,35 +42,65 @@ public class XFileStorageTest extends TestSuper {
return this.getClass().getResourceAsStream("/test.png");
}
@Test
@DisplayName("分片上传")
@Disabled
@SneakyThrows
public void testMultipartUpload() {
File file = new File("D:\\test.mp4");
String uploadId = fileService.setPlatform("aliyun").setUri("/test.mp4").multipartUploadInit();
try (
InputStream in = new FileInputStream(file);
) {
byte[] bs = new byte[5 * 1024 * 1024];//每一片5MB
int len = 0;
int partNumber = 0;
try {
while ((len = in.read(bs)) > 0) {
partNumber++;
ByteArrayInputStream bin = new ByteArrayInputStream(bs, 0, len);
fileService.multipartUpload(uploadId, partNumber, bin);
out("上传分片成功:" + partNumber + " len:" + len);
}
out("分片上传成功:" + fileService.multipartUploadComplete(uploadId));
} catch (Exception e) {
out("分片上传失败", e);
fileService.multipartUploadAbort(uploadId);
}
@Test
@DisplayName("上传获取hash值")
@Disabled
@SneakyThrows
public void testUploadAndHash() {
out("保存随机文件名:" + fileService.setMd5().setSha256().setFilename("test.png").save(getInstream()));
out("md5:"+fileService.getMd5());//7edbdf71867c45ca4f15b4025fc6a5dc
out("sha256:"+fileService.getSha256());//29f57210ca91b193272e4695adefe356a2f1586b07d3845c85afbf7708134a0a
}
@Test
@DisplayName("下载获取hash值")
@Disabled
@SneakyThrows
public void testDownloadAndHash() {
Downloader downloader = fileService.setMd5().setSha256().download("/files/default/2024/11/13/u6h22sja9w9p.png");
downloader.file(File.createTempFile("aaaa","bbbbb"));//必须先下载完成
out("md5:"+downloader.getHashCalculatorManager().getHashInfo().getMd5());//d41d8cd98f00b204e9800998ecf8427e
out("sha256:"+downloader.getHashCalculatorManager().getHashInfo().getSha256());//e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
}
@Test
@DisplayName("分片上传获取hash值")
@Disabled
@SneakyThrows
public void testMultipartUploadAndHash() {
out("分片上传不能获取hash值");
}
@Test
@DisplayName("分片上传")
@Disabled
@SneakyThrows
public void testMultipartUpload() {
File file = new File("D:\\test.mp4");
String uploadId = fileService.setPlatform("aliyun").setUri("/test.mp4").multipartUploadInit();
try (
InputStream in = new FileInputStream(file);
) {
byte[] bs = new byte[5 * 1024 * 1024];//每一片5MB
int len = 0;
int partNumber = 0;
try {
while ((len = in.read(bs)) > 0) {
partNumber++;
ByteArrayInputStream bin = new ByteArrayInputStream(bs, 0, len);
fileService.multipartUpload(uploadId, partNumber, bin);
out("上传分片成功:" + partNumber + " len:" + len);
}
out("分片上传成功:" + fileService.multipartUploadComplete(uploadId));
} catch (Exception e) {
out("分片上传失败", e);
fileService.multipartUploadAbort(uploadId);
}
}
}
@Test

@ -8,12 +8,14 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ruoyi.common.utils.IdUtils;
import lombok.Data;
import lombok.SneakyThrows;
import org.apache.tika.Tika;
import org.dromara.x.file.storage.core.Downloader;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.hash.HashInfo;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
@ -71,8 +73,24 @@ public interface FileService {
ThreadLocal<Param> paramThreadLocal = ThreadLocal.withInitial(() -> new Param());
ThreadLocal<HashInfo> hashInfoThreadLocal = new ThreadLocal<>();
/**
* md5
* @return
*/
default String getMd5() {
return hashInfoThreadLocal.get()==null?null:hashInfoThreadLocal.get().getMd5();
}
/**
* sha256
* @return
*/
default String getSha256() {
return hashInfoThreadLocal.get()==null?null:hashInfoThreadLocal.get().getSha256();
}
/**
*
*
@ -157,6 +175,45 @@ public interface FileService {
return this;
}
/**
* md5
* @return
*/
default FileService setMd5() {
paramThreadLocal.get().setMd5(true);
return this;
}
/**
* md5
* @param md5
* @return
*/
default FileService setMd5(boolean md5) {
paramThreadLocal.get().setMd5(md5);
return this;
}
/**
* Sha256
* @return
*/
default FileService setSha256() {
paramThreadLocal.get().setSha256(true);
return this;
}
/**
* Sha256
* @return
*/
default FileService setSha256(boolean sha256) {
paramThreadLocal.get().setSha256(sha256);
return this;
}
/**
*
*
@ -175,6 +232,7 @@ public interface FileService {
return this;
}
/**
*
*
@ -647,9 +705,14 @@ public interface FileService {
private String uri;
private int maxWidth = 0;
private int maxHeight = 0;
@JsonIgnore
private BufferedImage watermark;
private int thWidth = 0;
private int thHeight = 0;
private boolean md5 = false;
private boolean sha256 = false;
}
}

@ -69,6 +69,7 @@ public class FileServiceImpl implements FileService {
.setPath(p.getPath())
.setSaveFilename(p.getSaveFilename())
.putMetadata(isUpyunUss, "X-Upyun-Multi-Part-Size", String.valueOf(5 * 1024 * 1024))// 设置 Metadata不需要可以不写
.init();
String uploadId = UUID.fastUUID().toString(true);
@ -85,6 +86,7 @@ public class FileServiceImpl implements FileService {
if (fileInfo == null) {
throw new RuntimeException("未初始化分片上传");
}
service.uploadPart(fileInfo, partNumber, inputStream).upload();
}
@ -95,7 +97,9 @@ public class FileServiceImpl implements FileService {
if (fileInfo == null) {
throw new RuntimeException("未初始化分片上传");
}
service.completeMultipartUpload(fileInfo).complete();
service.completeMultipartUpload(fileInfo).complete();
RedisUtils.deleteObject(CACHE_KEY_PREFIX + uploadId);
return fileInfo.getUrl();
}
@ -131,7 +135,8 @@ public class FileServiceImpl implements FileService {
public Downloader download(String url) {
try {
FileInfo fileInfo = getFileInfoByURL(url);
return service.download(fileInfo);
Param param = paramThreadLocal.get();
return service.download(fileInfo).setHashCalculatorMd5(param.isMd5()).setHashCalculatorSha256(param.isSha256());
} finally {
paramThreadLocal.remove();
}
@ -147,7 +152,7 @@ public class FileServiceImpl implements FileService {
if (fileStorage.isSupportPresignedUrl()) {
url = generatePresignedUrlInner(url, null, fileInfo, fileStorage);
log.debug("跳转:"+url);
log.debug("跳转:" + url);
response.reset();
response.setStatus(HttpServletResponse.SC_FOUND);
response.setHeader("Location", url);
@ -238,7 +243,11 @@ public class FileServiceImpl implements FileService {
UploadPretreatment p = service.of(in);
Param param = paramThreadLocal.get();
initUploadPretreatment(p, param);
return p.upload().getUrl();
FileInfo fileInfo = p.upload();
if (param.isSha256() || param.isMd5()) {
hashInfoThreadLocal.set(fileInfo.getHashInfo());
}
return fileInfo.getUrl();
} finally {
paramThreadLocal.remove();
}
@ -257,7 +266,11 @@ public class FileServiceImpl implements FileService {
param.setFilename(FileService.DEFAULT_IMAGE_FILENAME);
UploadPretreatment p = service.of(formatImage(image, param.getMaxWidth(), param.getMaxHeight(), param.getWatermark()));
initUploadPretreatment(p, param);
String url = p.upload().getUrl();
FileInfo fileInfo = p.upload();
if (param.isSha256() || param.isMd5()) {
hashInfoThreadLocal.set(fileInfo.getHashInfo());
}
String url = fileInfo.getUrl();
if (param.getThHeight() > 0 && param.getThWidth() > 0) {
UploadPretreatment p1 = service.of(formatImage(image, param.getThWidth(), param.getThHeight(), null));
String platform = param.getPlatform();
@ -346,6 +359,14 @@ public class FileServiceImpl implements FileService {
} else {
p = p.setPlatform(service.getFileStorage().getPlatform());
}
if (param.isMd5()) {
p = p.setHashCalculatorMd5();
}
if (param.isSha256()) {
p = p.setHashCalculatorSha256();
}
String uri = param.getUri();
if (StrUtil.isBlank(uri)) {
String rule = param.getRule();

Loading…
Cancel
Save