Skip to content
This repository has been archived by the owner on Mar 1, 2024. It is now read-only.

Commit

Permalink
fix bugs.
Browse files Browse the repository at this point in the history
  • Loading branch information
LanYunDev committed Feb 4, 2024
1 parent 3a00dd0 commit 1868bb1
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 17 deletions.
38 changes: 22 additions & 16 deletions assets/templates/footer.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,7 @@ const uploadFile = (file) => {

const handleSuccess = (url) => console.log(`${file_name}: ${serverUrl}${url}`);
const handleFailure = (error) => {
// 恢复上传按钮状态
$uploadButton.disabled = false;
$uploadButton.textContent = "点击上传";
recoverUploadButton();

console.error('上传失败! ', error);
return Promise.reject("上传失败! ", error);
Expand All @@ -48,13 +46,13 @@ const uploadFile = (file) => {
if (start < file.size) {
// 获取当前文件块
const chunk = file.slice(start, end);

// 调用 handleFileUpload 函数上传文件块,并返回一个Promise
return handleFileUpload(chunk, 0, file_name, RetryMessage).then(
(url) => {
// 上传成功时,更新临时变量 temp
temp += `\n${url.substring(14)}`; // "/api/download/".length 为14

// 更新文件块起始和结束位置
start = end;
end = Math.min(start + SizeThreshold, file.size);
Expand All @@ -68,15 +66,15 @@ const uploadFile = (file) => {
// 如果还未达到最大重试次数,设置重试消息并进行重试
RetryMessage = `${file_name}上传块失败,${retryDelay / 1000}秒后重试 (${retries + 1}/${retryCount})`
console.warn(RetryMessage);
creatErrorElement(file,file_name,RetryMessage,error)
creatErrorElement(file, file_name, RetryMessage, error)

// 延迟指定时间后继续上传
return sleep(retryDelay).then(() => uploadNextChunk(start, end, retries + 1));
} else {
// 达到最大重试次数时,输出错误信息并启用上传按钮
RetryMessage = `${file_name}上传失败!已达到最大重试次数(${retryCount})!`
console.error(RetryMessage);
creatErrorElement(file,file_name,RetryMessage,error)
creatErrorElement(file, file_name, RetryMessage, error)
// 返回一个拒绝状态的Promise,以触发 catch 分支
return Promise.reject(RetryMessage);
}
Expand All @@ -100,7 +98,7 @@ const uploadFile = (file) => {
}
}

const creatErrorElement = (file,file_name,CustomMessage,message) => {
const creatErrorElement = (file, file_name, CustomMessage, message) => {
const identifier = `${file_name}_${file.size}_${file.lastModified}`;
const existingErrorElement = $response.querySelector(`.response-item.response-error[data-identifier="${identifier}"]`);
const ErrorMessage = CustomMessage ? `${CustomMessage} (${message})` : `${file_name}上传失败! (${message})`;
Expand All @@ -116,6 +114,15 @@ const creatErrorElement = (file,file_name,CustomMessage,message) => {
}
}

const recoverUploadButton = () => {
// 恢复上传状态
$uploadFile.value = "";
$uploadFileLabel.textContent = "选择文件或拖拽到此区域";
$uploadFileLabel.style.backgroundColor = "#007BFF";
$uploadButton.disabled = false;
$uploadButton.textContent = "点击上传";
}

const handleFileUpload = (file, showSuccessMessage, file_name, CustomMessage) => {
// 创建并返回一个 Promise 对象,用于异步处理上传逻辑
return new Promise((resolve, reject) => {
Expand Down Expand Up @@ -155,21 +162,20 @@ const handleFileUpload = (file, showSuccessMessage, file_name, CustomMessage) =>
<span class="copy-code" data-clipboard-text="${link}">复制外链</span>
</div>`;
$response.prepend(responseElement);
$uploadFile.value = "";
$uploadFileLabel.textContent = "选择文件或拖拽到此区域";
$uploadFileLabel.style.backgroundColor = "#007BFF";

// 恢复上传按钮状态
$uploadButton.disabled = false;
$uploadButton.textContent = "点击上传";
recoverUploadButton();
}
} else {
if (response.message === undefined) {
recoverUploadButton();
response.message = "未返回JSON数据!"
}
reject(response.message);
}
})
.catch(() => {
// 捕捉异常,处理上传失败逻辑
creatErrorElement(file,file_name,CustomMessage,response.message);
creatErrorElement(file, file_name, CustomMessage, response.message);
// $response.appendChild(errorElement);
// reject(errorElement.textContent);
})
Expand Down
2 changes: 1 addition & 1 deletion assets/templates_min/footer.tmpl
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{{define "public/footer"}}
<script defer>const $uploadButton=document.getElementById("uploadButton"),$response=document.getElementById("response"),$uploadFile=document.getElementById("uploadFile"),$uploadFileLabel=document.getElementById("uploadFileLabel"),$copyCodeButtons_text=".copy-code",errorClassName="response-item response-error",successClassName="response-item response-success",serverUrl=window.location.origin,serverUrl_API=`${serverUrl}/api`,SizeThreshold=20971520,retryCount=5,retryDelay=2e3,sleep=e=>new Promise((t=>setTimeout(t,e))),uploadFile=e=>{const t=e.name,o=e=>console.log(`${t}: ${serverUrl}${e}`),n=e=>($uploadButton.disabled=!1,$uploadButton.textContent="点击上传",console.error("上传失败! ",e),Promise.reject("上传失败! ",e));if(e.size<=20971520)handleFileUpload(e,1,t).then(o).catch(n);else{let l=`tgstate-blob\n${t}`,a=`${t}上传块第一次失败,将以每2秒重试(5)次!`;const s=(o,n,r=0)=>{if(o<e.size){const d=e.slice(o,n);return handleFileUpload(d,0,t,a).then((t=>(l+=`\n${t.substring(14)}`,o=n,n=Math.min(o+20971520,e.size),s(o,n))),(l=>r<5?(a=`${t}上传块失败,2秒后重试 (${r+1}/5)`,console.warn(a),creatErrorElement(e,t,a,l),sleep(2e3).then((()=>s(o,n,r+1)))):(a=`${t}上传失败!已达到最大重试次数(5)!`,console.error(a),creatErrorElement(e,t,a,l),Promise.reject(a))))}return Promise.resolve()};s(0,20971520).then((()=>{console.log(l);const e=new Blob([l],{type:"text/plain"}),o=new File([e],`${t}_fileAll.txt`,{type:"text/plain"});return handleFileUpload(o,1,t)})).then(o).catch(n)}},creatErrorElement=(e,t,o,n)=>{const l=`${t}_${e.size}_${e.lastModified}`,a=$response.querySelector(`.response-item.response-error[data-identifier="${l}"]`),s=o?`${o} (${n})`:`${t}上传失败! (${n})`;if(a)a.textContent=s;else{const e=document.createElement("div");e.className=errorClassName,e.textContent=s,$response.prepend(e)}},handleFileUpload=(e,t,o,n)=>new Promise(((l,a)=>{const s=new FormData;s.append("file",e),$uploadButton.disabled||($uploadButton.disabled=!0,$uploadButton.textContent=`${o}上传中`),fetch(serverUrl_API,{method:"POST",body:s,headers:{}}).then((e=>e.json())).then((n=>{if(1===n.code){if(l(n.message),t){const t=`${serverUrl}${n.message}?filename=${o}`,l=document.createElement("div"),a=e.type.startsWith("image/")?"图片":"文件";l.className=successClassName,l.innerHTML=`<p>${o}上传成功,${a}外链: </p><a target="_blank" href="${t}">${t}</a><div class="copy-links"><span class="copy-code" data-clipboard-text="&lt;img src=&quot;${t}&quot; alt=&quot;Your Alt Text&quot;&gt;">HTML</span><span class="copy-code" data-clipboard-text="![Alt Text](${t})">Markdown</span><span class="copy-code" data-clipboard-text="[img]${t}[/img]">BBCode</span><span class="copy-code" data-clipboard-text="${t}">复制外链</span></div>`,$response.prepend(l),$uploadFile.value="",$uploadFileLabel.textContent="选择文件或拖拽到此区域",$uploadFileLabel.style.backgroundColor="#007BFF",$uploadButton.disabled=!1,$uploadButton.textContent="点击上传"}}else a(n.message)})).catch((()=>{creatErrorElement(e,o,n,response.message)}))})),$copyCodeButtonsContainer=document.body;$copyCodeButtonsContainer.addEventListener("click",(function(e){const t=e.target.closest(".copy-code");if(t){const e=t.dataset.clipboardText,o=t.textContent;try{navigator.clipboard.writeText(e)}catch(e){console.error("使用Clipboard API复制失败:",e);const o=t.dataset.clipboardText,n=document.createElement("input");document.body.appendChild(n),n.value=o,n.select(),document.execCommand("copy"),document.body.removeChild(n)}t.textContent="复制成功",setTimeout((()=>t.textContent=o),500)}})),document.addEventListener("DOMContentLoaded",(function(){$uploadFile.addEventListener("change",(function(){handleFileSelection(this.files)})),$uploadButton.addEventListener("click",(function(){if($uploadFile.files.length>0)for(let e=0;e<$uploadFile.files.length;e++)uploadFile($uploadFile.files[e]);else alert("请至少选择一个文件")}));let e=0;document.documentElement.addEventListener("dragover",(function(e){e.preventDefault()})),document.documentElement.addEventListener("dragenter",(function(t){t.preventDefault(),0===e&&(document.documentElement.style.backgroundColor="rgba(0, 123, 255, 0.1)"),e++})),document.documentElement.addEventListener("dragleave",(function(t){e--,0===e&&(document.documentElement.style.backgroundColor="transparent")})),document.documentElement.addEventListener("drop",(function(t){t.preventDefault(),document.documentElement.style.backgroundColor="transparent",$uploadFile.files=t.dataTransfer.files,handleFileSelection($uploadFile.files),e=0}))}));const handleFileSelection=e=>{e.length>0?(1===e.length?$uploadFileLabel.textContent="已选择文件: "+e[0].name:$uploadFileLabel.textContent=`已选择${e.length}个文件`,$uploadFileLabel.style.backgroundColor="#0056b3"):($uploadFileLabel.textContent="选择文件或拖拽到此区域",$uploadFileLabel.style.backgroundColor="#007BFF")}</script>
<script defer>const $uploadButton=document.getElementById("uploadButton"),$response=document.getElementById("response"),$uploadFile=document.getElementById("uploadFile"),$uploadFileLabel=document.getElementById("uploadFileLabel"),$copyCodeButtons_text=".copy-code",errorClassName="response-item response-error",successClassName="response-item response-success",serverUrl=window.location.origin,serverUrl_API=`${serverUrl}/api`,SizeThreshold=20971520,retryCount=5,retryDelay=2e3,sleep=e=>new Promise((t=>setTimeout(t,e))),uploadFile=e=>{const t=e.name,o=e=>console.log(`${t}: ${serverUrl}${e}`),n=e=>(recoverUploadButton(),console.error("上传失败! ",e),Promise.reject("上传失败! ",e));if(e.size<=20971520)handleFileUpload(e,1,t).then(o).catch(n);else{let l=`tgstate-blob\n${t}`,a=`${t}上传块第一次失败,将以每2秒重试(5)次!`;const r=(o,n,s=0)=>{if(o<e.size){const d=e.slice(o,n);return handleFileUpload(d,0,t,a).then((t=>(l+=`\n${t.substring(14)}`,o=n,n=Math.min(o+20971520,e.size),r(o,n))),(l=>s<5?(a=`${t}上传块失败,2秒后重试 (${s+1}/5)`,console.warn(a),creatErrorElement(e,t,a,l),sleep(2e3).then((()=>r(o,n,s+1)))):(a=`${t}上传失败!已达到最大重试次数(5)!`,console.error(a),creatErrorElement(e,t,a,l),Promise.reject(a))))}return Promise.resolve()};r(0,20971520).then((()=>{console.log(l);const e=new Blob([l],{type:"text/plain"}),o=new File([e],`${t}_fileAll.txt`,{type:"text/plain"});return handleFileUpload(o,1,t)})).then(o).catch(n)}},creatErrorElement=(e,t,o,n)=>{const l=`${t}_${e.size}_${e.lastModified}`,a=$response.querySelector(`.response-item.response-error[data-identifier="${l}"]`),r=o?`${o} (${n})`:`${t}上传失败! (${n})`;if(a)a.textContent=r;else{const e=document.createElement("div");e.className=errorClassName,e.textContent=r,$response.prepend(e)}},recoverUploadButton=()=>{$uploadFile.value="",$uploadFileLabel.textContent="选择文件或拖拽到此区域",$uploadFileLabel.style.backgroundColor="#007BFF",$uploadButton.disabled=!1,$uploadButton.textContent="点击上传"},handleFileUpload=(e,t,o,n)=>new Promise(((l,a)=>{const r=new FormData;r.append("file",e),$uploadButton.disabled||($uploadButton.disabled=!0,$uploadButton.textContent=`${o}上传中`),fetch(serverUrl_API,{method:"POST",body:r,headers:{}}).then((e=>e.json())).then((n=>{if(1===n.code){if(l(n.message),t){const t=`${serverUrl}${n.message}?filename=${o}`,l=document.createElement("div"),a=e.type.startsWith("image/")?"图片":"文件";l.className=successClassName,l.innerHTML=`<p>${o}上传成功,${a}外链: </p><a target="_blank" href="${t}">${t}</a><div class="copy-links"><span class="copy-code" data-clipboard-text="&lt;img src=&quot;${t}&quot; alt=&quot;Your Alt Text&quot;&gt;">HTML</span><span class="copy-code" data-clipboard-text="![Alt Text](${t})">Markdown</span><span class="copy-code" data-clipboard-text="[img]${t}[/img]">BBCode</span><span class="copy-code" data-clipboard-text="${t}">复制外链</span></div>`,$response.prepend(l),recoverUploadButton()}}else void 0===n.message&&(recoverUploadButton(),n.message="未返回JSON数据!"),a(n.message)})).catch((()=>{creatErrorElement(e,o,n,response.message)}))})),$copyCodeButtonsContainer=document.body;$copyCodeButtonsContainer.addEventListener("click",(function(e){const t=e.target.closest(".copy-code");if(t){const e=t.dataset.clipboardText,o=t.textContent;try{navigator.clipboard.writeText(e)}catch(e){console.error("使用Clipboard API复制失败:",e);const o=t.dataset.clipboardText,n=document.createElement("input");document.body.appendChild(n),n.value=o,n.select(),document.execCommand("copy"),document.body.removeChild(n)}t.textContent="复制成功",setTimeout((()=>t.textContent=o),500)}})),document.addEventListener("DOMContentLoaded",(function(){$uploadFile.addEventListener("change",(function(){handleFileSelection(this.files)})),$uploadButton.addEventListener("click",(function(){if($uploadFile.files.length>0)for(let e=0;e<$uploadFile.files.length;e++)uploadFile($uploadFile.files[e]);else alert("请至少选择一个文件")}));let e=0;document.documentElement.addEventListener("dragover",(function(e){e.preventDefault()})),document.documentElement.addEventListener("dragenter",(function(t){t.preventDefault(),0===e&&(document.documentElement.style.backgroundColor="rgba(0, 123, 255, 0.1)"),e++})),document.documentElement.addEventListener("dragleave",(function(t){e--,0===e&&(document.documentElement.style.backgroundColor="transparent")})),document.documentElement.addEventListener("drop",(function(t){t.preventDefault(),document.documentElement.style.backgroundColor="transparent",$uploadFile.files=t.dataTransfer.files,handleFileSelection($uploadFile.files),e=0}))}));const handleFileSelection=e=>{e.length>0?(1===e.length?$uploadFileLabel.textContent="已选择文件: "+e[0].name:$uploadFileLabel.textContent=`已选择${e.length}个文件`,$uploadFileLabel.style.backgroundColor="#0056b3"):($uploadFileLabel.textContent="选择文件或拖拽到此区域",$uploadFileLabel.style.backgroundColor="#007BFF")}</script>
{{end}}
Binary file removed tgstate_arm64
Binary file not shown.
Binary file removed tgstate_x64
Binary file not shown.

0 comments on commit 1868bb1

Please # to comment.