圖片粘貼上傳實現

圖片上傳 html demo

直接粘貼本地運行查看效果即可,有看不懂的直接喂給 deepseek 會解釋的很清晰

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>粘貼圖片上傳示例 - 使用場景,粘貼桌面圖片上傳、粘貼word 文檔中圖片上傳、直接截圖上傳等</title><style>body {font-family: Arial, sans-serif;padding: 20px;}.upload-area {width: 100%;height: 200px;border: 2px dashed #ccc;display: flex;align-items: center;justify-content: center;color: #666;font-size: 18px;margin-bottom: 20px;}.file-list {margin-top: 20px;}.file-item {margin-bottom: 10px;padding: 10px;border: 1px solid #ddd;background-color: #f9f9f9;}.file-item.uploading {background-color: #e0f7fa;}.file-item.done {background-color: #e8f5e9;}.file-item.error {background-color: #ffebee;}</style>
</head>
<body><h1>粘貼圖片上傳示例</h1><div class="upload-area">請在此區域粘貼圖片</div><div class="file-list"><h2>文件列表</h2><div id="file-list-container"></div></div><script>// 模擬語言包const t = (key) => {const translations = {'examination.pasteNoContent': '粘貼內容為空',};return translations[key] || key;};// 生成唯一 IDconst uuidv4 = () => {return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {const r = (Math.random() * 16) | 0;const v = c === 'x' ? r : (r & 0x3) | 0x8;return v.toString(16);});};// 文件上傳前的校驗const onBeforeUpload = async (file, { maxHeight, maxWidth, size, maxCount, t, fileList }) => {if (fileList.length >= maxCount) {alert(`最多只能上傳 ${maxCount} 張圖片`);return false;}if (file.size > size) {alert(`文件大小不能超過 ${size / 1024 / 1024}MB`);return false;}return true;};// 模擬文件上傳函數const fileUpload = (file, { onSuccess, onError }) => {setTimeout(() => {if (Math.random() > 0.5) {onSuccess({ url: 'https://example.com/uploaded-image.jpg' });} else {onError('上傳失敗,請重試');}}, 2000); // 模擬 2 秒上傳時間};// 數據處理函數const dataHandle = ({ file, fileList }) => {return { file, fileList };};// 粘貼圖片上傳處理函數const handelPasteImageUpload = async (event, {t,resource = { images: [] },onStartUpload,onUploadSuccess,onUploadError,imageUploadLimitConfig,}) => {const fileList = resource.images || [];const clipboardData = event.clipboardData;if (clipboardData) {const items = clipboardData.items || [];if (items.length <= 0) {alert(t('examination.pasteNoContent'));return;}for (let i = 0; i < items.length; i++) {const item = items[i];if (item.type.indexOf('image') !== -1) {event.preventDefault(); // 阻止默認行為const originFileObj = item.getAsFile(); // 獲取文件對象// 構建文件數據對象const fileDataObj = {originFileObj,uid: uuidv4(),lastModified: originFileObj.lastModified,name: originFileObj.name,size: originFileObj.size,type: originFileObj.type,};const { maxHeight, maxWidth, size, maxCount } = imageUploadLimitConfig;// 文件上傳前的校驗const flag = await onBeforeUpload(originFileObj, {maxHeight,maxWidth,size: size.image,maxCount: maxCount.image,t,fileList,});if (flag) {const newFileList = [...fileList, fileDataObj].map((item) => {if (item.uid === fileDataObj.uid) {return { ...item, status: 'uploading' };}return item;});// 調用開始上傳回調onStartUpload(dataHandle({ file: fileDataObj, fileList: newFileList }));// 模擬文件上傳fileUpload(originFileObj, {onSuccess: (response) => {const updatedFileList = newFileList.map((item) => {if (item.uid === fileDataObj.uid) {return { ...item, status: 'done', response };}return item;});onUploadSuccess(dataHandle({ file: fileDataObj, fileList: updatedFileList }));},onError: (error) => {const updatedFileList = newFileList.map((item) => {if (item.uid === fileDataObj.uid) {return { ...item, status: 'error', response: error };}return item;});onUploadError(dataHandle({ file: fileDataObj, fileList: updatedFileList }));},});}}}}};// 初始化document.addEventListener('paste', (event) => {handelPasteImageUpload(event, {t,resource: { images: [] },onStartUpload: (data) => {console.log('開始上傳:', data);renderFileList(data.fileList);},onUploadSuccess: (data) => {console.log('上傳成功:', data);renderFileList(data.fileList);},onUploadError: (data) => {console.error('上傳失敗:', data);renderFileList(data.fileList);},imageUploadLimitConfig: {maxHeight: 1000,maxWidth: 1000,size: { image: 5 * 1024 * 1024 }, // 5MBmaxCount: { image: 10 },},});});// 渲染文件列表const renderFileList = (fileList) => {const container = document.getElementById('file-list-container');container.innerHTML = fileList.map((file) => `<div class="file-item ${file.status}"><strong>${file.name}</strong> - ${file.status}${file.response ? `<br>響應: ${JSON.stringify(file.response)}` : ''}</div>`).join('');};</script>
</body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71516.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71516.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71516.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RedisTemplate存儲含有特殊字符解決

ERROR信息: 案發時間: 2025-02-18 01:01 案發現場: UserServiceImpl.java 嫌疑人: stringRedisTemplate.opsForValue().set(SystemConstants.LOGIN_CODE_PREFIX phone, code, Duration.ofMinutes(3L)); // 3分鐘過期作案動機: stringRedisTemplate繼承了Redistemplate 使用的…

Python正則表達式學習

Python正則表達式全攻略 一、正則表達式基礎 1. 什么是正則表達式&#xff1f; 用于描述字符串匹配規則的表達式廣泛應用于文本處理、表單驗證、數據清洗等領域 2. Python中的re模塊 import re3. 基礎語法 字符說明示例.匹配任意字符(除換行)a.c → abc\d數字 [0-9]\d\d …

20250218 隨筆 垂直分庫分表(Vertical Sharding) 和 水平分庫分表(Horizontal Sharding)

垂直分庫分表&#xff08;Vertical Sharding&#xff09; 和 水平分庫分表&#xff08;Horizontal Sharding&#xff09; 是數據庫拆分的兩種策略。它們在大規模數據庫優化、分布式架構設計中至關重要&#xff0c;主要用于 降低單庫壓力、提高查詢效率、支持高并發。 1. 垂直分…

notepad++右鍵菜單不見了

卸載時沒點擊完成&#xff0c;又重新安裝了一個&#xff0c;最終導致了一些bug&#xff0c;導致右鍵沒有notepad菜單。 解決方式&#xff1a; 新建一個register.reg文件&#xff0c;加入以下代碼&#xff0c;然后雙擊執行即可 代碼說明&#xff1a;Open with Notepad 是右…

重定向與文件緩沖機制

目錄 一、重定向的原理與實踐 1. 輸出重定向&#xff1a;讓數據流向新目的地 2. 追加重定向&#xff1a;在文件末尾追加數據 3. 輸入重定向&#xff1a;從指定文件讀取數據 4. 標準輸出流與標準錯誤流的區別 5. 使用 dup2 實現重定向 二、FILE 結構體的奧秘 1. FILE 中的…

DeepSeek 沖擊(含本地化部署實踐)

DeepSeek無疑是春節檔最火爆的話題&#xff0c;上線不足一月&#xff0c;其全球累計下載量已達4000萬&#xff0c;反超ChatGPT成為全球增長最快的AI應用&#xff0c;并且完全開源。那么究竟DeepSeek有什么魔力&#xff0c;能夠讓大家趨之若鶩&#xff0c;他又將怎樣改變世界AI格…

顯微鏡下的人體結構

顯微鏡下的人體結構&#xff0c;看完以后&#xff0c;你還覺得人類是進化而來的嗎&#xff1f;...... 第一張&#xff1a;電子顯微鏡所觀察到的人類血管&#xff0c;可以非常清楚的看到里面的白細胞和紅細胞 第二張&#xff1a;正在分泌耳垢&#xff08;耳屎&#xff09;的耳道…

DApp 開發入門指南

DApp 開發入門指南 &#x1f528; 1. DApp 基礎概念 1.1 什么是 DApp&#xff1f; 去中心化應用&#xff08;DApp&#xff09;是基于區塊鏈的應用程序&#xff0c;特點是&#xff1a; 后端運行在區塊鏈網絡前端可以是任何框架使用智能合約處理業務邏輯數據存儲在區塊鏈上 1…

鴻蒙狀態管理概述 v2

狀態管理v2 概述狀態管理之v2ObservedV2 和 Trace狀態管理V1版本對嵌套類對象屬性變化直接觀測的局限性ObservedV2 和 Trace 使用場景 Local狀態管理V1版本State裝飾器的局限性 Param狀態管理V1版本接受外部傳入的裝飾器的局限性 OnceEventComputedComputed 使用場景 TypePersi…

Git中revert和reset區別?

git revert 和 git reset 都用于撤銷 Git 中的提交&#xff0c;但它們的作用和使用場景不同&#xff1a; git revert: 作用&#xff1a;創建一個新的提交&#xff0c;撤銷指定的提交內容。使用場景&#xff1a;用于“回滾”已推送到遠程倉庫的提交。這種方法不會改變提交歷史&a…

LabVIEW開發中的電機控制與相機像素差

在電機控制系統中&#xff0c;我們需要精確控制電機運動與相機拍攝畫面之間的關系。理想情況下&#xff0c;當電機帶動相機移動同樣的距離時&#xff0c;相機拍攝畫面中兩點之間的像素差應當是一個固定值。然而&#xff0c;在實際應用中&#xff0c;我們發現這一像素差并非固定…

從零到一:構建現代 React 應用的完整指南

1. create-react-app (CRA) 簡介: create-react-app 是官方推薦的 React 項目腳手架工具,提供了一個開箱即用的開發環境,幫助開發者快速啟動 React 應用。它會自動配置 Webpack、Babel、ESLint 等工具,讓你專注于開發而不需要手動配置工具鏈。 特點: 零配置:CRA 自動配…

rman 備份恢復1

前提&#xff1a; rman用戶必須具有sysdba權限 使用常用連接方式如下&#xff1a; rman target / rman target sys/oracle rman target sys/oracleprod1 catalog dav/oracledav_db 一個rman連接會產生兩個進程&#xff0c;action字段為空的就是rman的監控進程&#xff0c;另…

Qt程序退出相關資源釋放問題

目錄 問題背景&#xff1a; aboutToQuit 代碼舉例 closeEvent事件 代碼舉例 程序退出方式 quit() exit(int returnCode 0) close() 問題背景&#xff1a; 實際項目中程序退出前往往需要及進行一些資源釋放、配置保存、線程中斷等操作&#xff0c;避免資源浪費&#xff…

【DeepSeek】Mac m1電腦部署DeepSeek

一、電腦配置 個人電腦配置 二、安裝ollama 簡介&#xff1a;Ollama 是一個強大的開源框架&#xff0c;是一個為本地運行大型語言模型而設計的工具&#xff0c;它幫助用戶快速在本地運行大模型&#xff0c;通過簡單的安裝指令&#xff0c;可以讓用戶執行一條命令就在本地運…

[生活雜項][運動教程]自由泳

https://v.youku.com/v_show/id_XMzgzMjkwMzg0MA.html?spma2h0k.11417342.soresults.dtitle https://v.youku.com/v_show/id_XMzgxNjM2NjY4NA.html?spma2h0k.11417342.soresults.dtitle

Linux的指令與熱鍵

一.指令 1.pwd :顯示一個用戶當前所處的目錄 2.ls :顯示當前目錄下的文件&#xff08;顯示當前文件屬性&#xff09; ls -l :顯示當前目錄下文件的屬性及更多內容&#xff08;ll是ls -l的別名&#xff0c;用法相同&#xff09; ls -l 目錄&#xff1a;顯示指定目錄內容 ls…

【Dubbo+Zookeeper】——SpringBoot+Dubbo+Zookeeper知識整合

&#x1f3bc;個人主頁&#xff1a;【Y小夜】 &#x1f60e;作者簡介&#xff1a;一位雙非學校的大二學生&#xff0c;編程愛好者&#xff0c; 專注于基礎和實戰分享&#xff0c;歡迎私信咨詢&#xff01; &#x1f386;入門專欄&#xff1a;&#x1f387;【MySQL&#xff0…

【OS安裝與使用】part5-ubuntu22.04基于conda安裝pytorch+tensorflow

文章目錄 一、待解決問題1.1 問題描述1.2 解決方法 二、方法詳述2.1 必要說明2.2 應用步驟2.2.1 明確pytorch安裝依賴2.2.2 conda創建虛擬環境2.2.3 安裝pytorch2.2.4 驗證pytorch安裝2.2.5 安裝Tensorflow2.2.6 驗證Tensorflow安裝 三、疑問四、總結 一、待解決問題 1.1 問題…

馬拉車算法

Manacher算法 ,用于處理最長回文字符串的問題&#xff0c;可以在O&#xff08;n&#xff09;的情況下&#xff0c;求出一個字符串的最長回文字符串 回文串的基礎解法&#xff1a; 以每個點為中心對稱點&#xff0c;看左右兩邊的點是否相同。這種算法的時間復雜度為O&#xff0…