mirror of
https://github.com/schroinerxy/cloud-mail.git
synced 2026-06-21 19:35:50 +08:00
修复删除S3文件没有MD5异常
This commit is contained in:
@@ -187,7 +187,7 @@
|
||||
<div class="settings-card">
|
||||
<div class="card-title">{{ $t('oss') }}</div>
|
||||
<div class="card-content">
|
||||
<div class="setting-item">
|
||||
<div class="r2domain-item">
|
||||
<div><span>{{ $t('osDomain') }}</span></div>
|
||||
<div class="r2domain">
|
||||
<span>{{ setting.r2Domain || '' }}</span>
|
||||
@@ -199,9 +199,7 @@
|
||||
<div class="setting-item">
|
||||
<div><span>{{ $t('s3Configuration') }}</span></div>
|
||||
<div class="r2domain">
|
||||
<el-button @mouseenter="s3IsDisabled = true"
|
||||
@mouseleave="s3IsDisabled = false"
|
||||
:disabled="setting.hasR2 && s3IsDisabled" class="opt-button" size="small" type="primary" @click="addS3Show = true">
|
||||
<el-button class="opt-button" size="small" type="primary" @click="addS3Show = true">
|
||||
<Icon icon="fluent:settings-48-regular" width="16" height="16"/>
|
||||
</el-button>
|
||||
</div>
|
||||
@@ -699,7 +697,6 @@ const r2DomainInput = ref('')
|
||||
const loginOpacity = ref(0)
|
||||
const backgroundUrl = ref('')
|
||||
let backgroundFile = {}
|
||||
const s3IsDisabled = ref(false)
|
||||
const showSetBackground = ref(false)
|
||||
let regVerifyCount = ref(1)
|
||||
let addVerifyCount = ref(1)
|
||||
@@ -1348,6 +1345,21 @@ function editSetting(settingForm, refreshStatus = true) {
|
||||
}
|
||||
}
|
||||
|
||||
.r2domain-item {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
> div:first-child {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
> div:last-child {
|
||||
flex: 1;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
|
||||
.title-icon.warning {
|
||||
position: relative;
|
||||
top: 2px;
|
||||
|
||||
@@ -28,34 +28,57 @@ const s3Service = {
|
||||
await client.send(new PutObjectCommand(obj))
|
||||
},
|
||||
|
||||
async deleteObj(c,keys) {
|
||||
async deleteObj(c, keys) {
|
||||
|
||||
if (typeof keys === 'string') {
|
||||
keys = [keys]
|
||||
keys = [keys];
|
||||
}
|
||||
|
||||
if (keys.length === 0) {
|
||||
return
|
||||
return;
|
||||
}
|
||||
|
||||
const client = await this.client(c)
|
||||
|
||||
const client = await this.client(c);
|
||||
const { bucket } = await settingService.query(c);
|
||||
|
||||
|
||||
client.middlewareStack.add(
|
||||
(next) => async (args) => {
|
||||
|
||||
const body = args.request.body
|
||||
|
||||
// 计算 MD5 校验和并转换为 Base64 编码
|
||||
const encoder = new TextEncoder();
|
||||
const data = encoder.encode(body);
|
||||
|
||||
// 使用 Web Crypto API 计算 MD5 校验和
|
||||
const hashBuffer = await crypto.subtle.digest('MD5', data);
|
||||
const hashArray = new Uint8Array(hashBuffer);
|
||||
const contentMD5 = btoa(String.fromCharCode.apply(null, hashArray));
|
||||
|
||||
args.request.headers["Content-MD5"] = contentMD5;
|
||||
|
||||
return next(args);
|
||||
},
|
||||
{ step: "build", name: "inspectRequestMiddleware" }
|
||||
);
|
||||
|
||||
|
||||
await client.send(
|
||||
new DeleteObjectsCommand({
|
||||
Bucket: bucket,
|
||||
Delete: {
|
||||
Objects: keys.map(key => ({Key: key}))
|
||||
Objects: keys.map(key => ({ Key: key }))
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
},
|
||||
|
||||
|
||||
async client(c) {
|
||||
const { region, endpoint, s3AccessKey, s3SecretKey } = await settingService.query(c);
|
||||
return new S3Client({
|
||||
region: region,
|
||||
region: region || 'auto',
|
||||
endpoint: domainUtils.toOssDomain(endpoint),
|
||||
credentials: {
|
||||
accessKeyId: s3AccessKey,
|
||||
|
||||
Reference in New Issue
Block a user