优化粘贴图片功能

pull/361/head
HXY 2 years ago
parent c10051cd45
commit 734d048435

@ -263,7 +263,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { defineComponent } from 'vue' import { defineComponent } from "vue";
import { useStore } from "vuex"; import { useStore } from "vuex";
import { debounce } from "lodash"; import { debounce } from "lodash";
import { getSuggestUsers, getSuggestTags } from "@/api/user"; import { getSuggestUsers, getSuggestTags } from "@/api/user";
@ -282,7 +282,7 @@ import type { MentionOption, UploadFileInfo, UploadInst } from "naive-ui";
import { VisibilityEnum, PostItemTypeEnum } from "@/utils/IEnum"; import { VisibilityEnum, PostItemTypeEnum } from "@/utils/IEnum";
import { userLogin, userRegister, userInfo } from "@/api/auth"; import { userLogin, userRegister, userInfo } from "@/api/auth";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { MessageReactive } from 'naive-ui' import { MessageReactive } from "naive-ui";
const emit = defineEmits<{ const emit = defineEmits<{
(e: "post-success", post: Item.PostProps): void; (e: "post-success", post: Item.PostProps): void;
@ -702,28 +702,32 @@ const triggerAuth = (key: string) => {
store.commit("triggerAuthKey", key); store.commit("triggerAuthKey", key);
}; };
const generateRandomFileName = (extension: any) => { const generateRandomFileName = (extension: string | undefined): string => {
const timestamp = new Date().getTime(); // 获取当前时间戳 const timestamp = Date.now();
const randomString = Math.random().toString(36).substring(2, 15); // 生成随机字符串 const randomString = Math.random().toString(36).substring(2, 15);
return `${timestamp}-${randomString}.${extension}`; return `${timestamp}-${randomString}.${extension}`;
}; };
//粘贴事件监听 const handlePaste = async (event: ClipboardEvent) => {
const handlePaste = (event: ClipboardEvent) => { if (fileQueue.value.length >= 9) {
//粘贴图片提示 window.$message.warning("最多只能上传9张图片");
let messageReactive: MessageReactive | null = null return;
}
if (event && event.clipboardData) { let messageReactive: MessageReactive | null = null;
const items = event.clipboardData.items;
if (event?.clipboardData) {
const { items } = event.clipboardData;
let file: File | null = null; let file: File | null = null;
if (items && items.length) { if (items?.length) {
for (let i = 0; i < items.length; i++) { for (const item of Array.from(items)) {
if (items[i].type.indexOf("image") !== -1) { // 这里使用 Array.from 来转换为数组
if (!messageReactive) { if (item.type.includes("image")) {
messageReactive = window.$message.loading('',{duration: 0}) messageReactive =
} messageReactive ||
file = items[i].getAsFile(); window.$message.loading("正在粘贴图片", { duration: 0 });
file = item.getAsFile();
break; break;
} }
} }
@ -732,74 +736,78 @@ const handlePaste = (event: ClipboardEvent) => {
if (file) { if (file) {
const fileExtension = file.name.split(".").pop(); const fileExtension = file.name.split(".").pop();
const randomFileName = generateRandomFileName(fileExtension); const randomFileName = generateRandomFileName(fileExtension);
const pasteTimestamp: any = Date.now();
const pasteFile: UploadFileInfo = {
id: pasteTimestamp,
name: randomFileName,
batchId: pasteTimestamp,
percentage: 50,
status: "uploading",
url: null,
file,
thumbnailUrl: null,
type: "image/jpeg",
fullPath: `/${randomFileName}`,
};
// 以二进制形式读取文件内容 let combinedFileList = [...fileQueue.value, pasteFile];
const reader = new FileReader(); updateUpload(combinedFileList);
reader.onload = function (event) {
if (
event &&
event.target &&
event.target.result instanceof ArrayBuffer
) {
// 获取文件内容
const fileContent = new Uint8Array(event.target.result);
// 创建 Blob try {
const blob = new Blob([fileContent], { type: "image/jpeg" }); // 使用compressionFile函数来压缩图片自建的
const compressedFile = await compressionFile(file);
// 这里可以使用 blob 了 // 使用压缩后的文件来创建Uint8Array和Blob对象
const fileContent = new Uint8Array(await compressedFile.arrayBuffer());
const blob = new Blob([fileContent], { type: "image/jpeg" });
const formData = new FormData(); const formData = new FormData();
// 添加文件到 FormData 对象 formData.append("type", "public/image");
formData.append('type', 'public/image');
formData.append("file", blob, randomFileName); formData.append("file", blob, randomFileName);
const uploadImageReq: NetParams.UploadImageReq = { const uploadImageReq: NetParams.UploadImageReq = {
type: formData.get('type') as string, type: formData.get("type") as string,
file: formData.get('file') as File, file: formData.get("file") as File,
}; };
uploadImage(uploadImageReq, uploadToken.value) pasteFile.status = "uploading";
.then((response) => { pasteFile.percentage = 70;
// 处理响应 updateUploadList(pasteFile, combinedFileList);
const pasteTimestamp = new Date().getTime()
const pasteFile : UploadFileInfo[] = [{ const response = await uploadImage(uploadImageReq, uploadToken.value);
id: pasteTimestamp.toString(),
name: randomFileName,
batchId: pasteTimestamp.toString(),
percentage: 100,
status: 'finished',
url: null,
file: file,
thumbnailUrl: null,
type: "image/jpeg",
fullPath: "/" + randomFileName,
}]
const combinedFileList = fileQueue.value.concat(pasteFile);
updateUpload(combinedFileList) pasteFile.status = "finished";
pasteFile.percentage = 100;
pasteFile.url = response.content;
updateUploadList(pasteFile, combinedFileList);
imageContents.value.push({ imageContents.value.push({
id: pasteTimestamp.toString(), id: pasteTimestamp,
content: response.content, content: response.content,
} as Item.CommentItemProps); } as Item.CommentItemProps);
if (messageReactive) {
messageReactive.destroy()
messageReactive = null
}
})
.catch((error) => {
// 处理错误
console.error('', error);
});
}
};
reader.readAsArrayBuffer(file); messageReactive?.destroy();
messageReactive = null;
} catch (error) {
pasteFile.status = "error";
pasteFile.percentage = 0;
updateUploadList(pasteFile, combinedFileList);
}
} }
} }
}; };
const updateUploadList = (
pasteFile: UploadFileInfo,
combinedFileList: UploadFileInfo[]
) => {
combinedFileList = combinedFileList.map((file) =>
file.id === pasteFile.id ? pasteFile : file
);
updateUpload(combinedFileList);
};
onMounted(() => { onMounted(() => {
if ( if (
import.meta.env.VITE_DEFAULT_TWEET_VISIBILITY.toLowerCase() === "friend" import.meta.env.VITE_DEFAULT_TWEET_VISIBILITY.toLowerCase() === "friend"

Loading…
Cancel
Save