簡易跨平臺上傳文件,前后端demo

前端文件

<!DOCTYPE html>
<html>
<head><title>文件上傳</title>
</head>
<body>
<h1>文件上傳1-相對慢,需要等待本地選擇的文件全部上傳完成后,服務器再保存</h1>
<form id="uploadFormBatch" enctype="multipart/form-data"><input type="file" id="fileInputBatch" name="file" multiple><br><br><input type="button" id="btnBatch" value="批量提交整體上傳" onclick="clearLog(); uploadFilesBatch()">
</form><h1>文件上傳2-相對快-推薦使用,本地上傳一個,服務器保存一個,前端循環</h1>
<form id="uploadFormOne" enctype="multipart/form-data"><input type="file" id="fileInputOne" name="file" multiple><br><br><input type="button" id="btnOne" value="批量提交循環上傳" onclick="clearLog(); uploadFilesOne()">
</form>
<div id="log"></div>
<script>const url = 'http://localhost:8421'function clearLog() {const logDiv = document.getElementById('log');logDiv.innerHTML = "";  // 清空日志內容}// 獲取當前時間function getDate() {var now = new Date();console.log("當前時間是:" + now);return now;}// 獲取兩個時間的差值function diffDate(startTime, endTime) {// 獲取兩個時間的時間戳var startTimeStamp = startTime.getTime();var endTimeStamp = endTime.getTime();// 計算時間差(毫秒)var differenceInMilliseconds = endTimeStamp - startTimeStamp;// 將毫秒轉換為秒var differenceInSeconds = differenceInMilliseconds / 1000;console.log("兩個時間的差是:" + differenceInSeconds + "秒");return differenceInSeconds;}// 時間格式化 yyyy-MM-dd HH:mm:ssfunction formatDate(date) {const pad = (num) => (num < 10 ? '0' + num : num);var year = date.getFullYear();var month = pad(date.getMonth() + 1);var day = pad(date.getDate());var hour = pad(date.getHours());var minute = pad(date.getMinutes());var second = pad(date.getSeconds());return `${year}-${month}-${day} ${hour}:${minute}:${second}`;}function uploadFilesBatch() {const files = document.getElementById('fileInputBatch').files;const butBatch = document.getElementById('btnBatch');butBatch.disabled = true;// 禁用按鈕const startDate = getDate();appendLog('程序啟動-準備開始上傳:' + formatDate(startDate));const formData = new FormData();for (let i = 0; i < files.length; i++) {formData.append('files', files[i]);}fetch(url + '/upload_batch', {method: 'POST',body: formData}).then(response => {return response.text();}).then(data => {if (data === '文件上傳成功!') {// console.log(`文件 ${files.length} 上傳成功`);butBatch.disabled = false; //解除禁用const endDate = getDate();appendLog(`文件 ${files.length} 上傳成功:` + formatDate(endDate));appendLog(`總共耗時:` + diffDate(startDate, endDate) + `秒`);} else {console.error(`文件 ${files.length} 上傳失敗`);appendLog(`文件 ${files.length} 上傳失敗`);}}).catch(error => {console.error(`文件 ${files.length} 上傳失敗: ${error}`);appendLog(`文件 ${files.length} 上傳失敗: ${error}`);});}function uploadFilesOne() {const files = document.getElementById('fileInputOne').files;const btnOne = document.getElementById('btnOne');btnOne.disabled = true; // 禁用按鈕let index = 0;const startDate = getDate();appendLog('程序啟動-準備開始上傳:' + formatDate(startDate));function uploadFile(index) {const startDateOne = getDate();if (index >= files.length) {const endDate = getDate();appendLog("所有文件處理完成:" + formatDate(endDate));appendLog(`總共耗時:` + diffDate(startDate, endDate) + `秒`);btnOne.disabled = false;// 全部上傳完成,解除禁用return;}const file = files[index];const formData = new FormData();formData.append('file', file);appendLog(`文件 ${file.name} 正在上傳··· ···`)fetch(url + '/upload_one', {method: 'POST',body: formData}).then(response => {return response.text();}).then(data => {if (data === '文件上傳成功!') {const endDateOne = getDate();appendLog(`文件 ${file.name} 上傳成功,耗時:` + diffDate(startDateOne, endDateOne) + `秒`);uploadFile(index + 1);  // 遞歸調用上傳下一個文件} else {appendLog(`文件 ${file.name} 上傳失敗:${data}`);uploadFile(index);  // 文件上傳失敗則繼續上傳}}).catch(error => {console.error(`文件 ${file.name} 上傳失敗: ${error}`);appendLog(`文件 ${file.name} 上傳失敗: ${error}`);});}uploadFile(index);}function appendLog(message) {const logDiv = document.getElementById('log');// logDiv.innerHTML += message + "<br>";logDiv.innerHTML = `<p>${message}</p>` + logDiv.innerHTML;}
</script>
</body>
</html>

后端文件使用python

# -*- ecoding: utf-8 -*-
# @ModuleName: test002
# 當你要使用這份文件時,
# 代表你已經完全理解文件內容的含義,
# 并愿意為使用此文件產生的一切后果,付全部責任
# @Funcation: 
# @Author: darling
# @Time: 2024-06-17 14:21
from flask_cors import CORS
from flask import Flask, request
import os
from loguru import loggerapp = Flask(__name__)
CORS(app)@app.route('/upload_one', methods=['POST'])
def upload_one():'''前端上傳,批量選擇后,前端循環上傳,后端單個接收:return:'''file = request.files['file']  # 獲取上傳的文件if file:logger.info('獲取到文件{}', file.filename)file.save(os.path.join('files', file.filename))  # 保存文件到當前目錄logger.info('保存結束{}', file.filename)return '文件上傳成功!'else:return '文件上傳失敗!'@app.route('/upload_batch', methods=['POST'])
def upload_batch():'''前端上傳,批量選擇后一次性上傳,后端循環保存:return:'''files = request.files.getlist('files')  # 獲取上傳的文件列表if files:for file in files:logger.info('獲取到文件{}', file.filename)file.save(os.path.join('files', file.filename))  # 保存文件到當前目錄logger.info('保存結束{}', file.filename)return '文件上傳成功!'else:return '文件上傳失敗!'if __name__ == '__main__':app.run(host='0.0.0.0', port=8421)

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

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

相關文章

ORA-01775: 同義詞的循環鏈問題

一、問題描述 ORA-01775: 同義詞的循環鏈問題 二、 原因分析 同義詞對應的對象&#xff08;表等&#xff09;已刪除&#xff0c;不存在了。 可能原因&#xff1a; 刪除數據庫對象&#xff0c;但是忘記刪除同義詞。刪除一個用戶&#xff0c;但忘記刪除此用戶中相關的同義詞…

@Param參數

Param參數 當方法參數大于兩個的時候必須傳遞&#xff0c;只有一個的時候可以不傳。大于兩個的時候也可以用#{arg0}和#{arg1}。。。來取值 Param&#xff08;&#xff09;括號里面的值對應sql語句中 # {} 里面的值 看AI的解釋

模版方法模式詳解:使用和實現的指南

目錄 模版方法模式模版方法模式結構模版方法模式適合應用場景模版方法模式優缺點練手題目題目描述輸入描述輸出描述題解 模版方法模式 模板方法模式是一種行為設計模式&#xff0c; 它在超類中定義了一個算法的框架&#xff0c; 允許子類在不修改結構的情況下重寫算法的特定步…

《昇思25天學習打卡營第3天|張量 Tensor》

文章目錄 前言&#xff1a;今日所學&#xff1a;1. 創建張量2. 張量的屬性3.張量索引與運算4. NumPy與Tensor的轉換5. 稀疏張量 前言&#xff1a; 張量&#xff1f;張亮&#xff1f;張量是什么&#xff1f; 張量是一個可以用來表示在一些矢量、標量和其他張量之間的線性關系的…

高并發部署:基于 Gunicorn、Flask 和 Docker

一、準備工作 確保已經安裝以下軟件&#xff1a; DockerDocker ComposePython 3.x 二、創建 Flask 應用 首先&#xff0c;創建一個簡單的 Flask 應用。創建一個新的目錄并在其中創建以下文件&#xff1a; 1. app.py python fromflask importFlask, jsonifyapp Flask(__…

leetcode 第133場雙周賽 100333.統計逆序對的數目【計數dp/滾動數組/前綴和優化】

分析&#xff1a; 先考慮如下問題。 求長度為n&#xff0c;逆序對為m的排列數量。 可以考慮dp&#xff0c;dp[i][j]定義為長度為i&#xff0c;逆序對為j的排列數量。 dp[1][0] 1; //枚舉排列長度&#xff0c;或者認為枚舉當前需要插到長度為i-1的排列中的數字 for(int i 1…

OpenAI封殺不支持地區API:違規封號,7月9日生效

OpenAI 在檢測用戶使用其 API 的地區后&#xff0c;提示所有不支持位置的用戶 昨晚&#xff0c;很多大模型應用的開發者、程序員都收到了 OpenAI 的警告信&#xff0c;心里一驚。 OpenAI 在檢測用戶使用其 API 的地區后&#xff0c;提示所有不支持位置的用戶&#xff1a;即將封…

冒泡排序、選擇排序、插入排序~java版

1、冒泡排序&#xff08;Bubble Sort&#xff09; 冒泡排序的基本思想是多次遍歷待排序序列&#xff0c;每次遍歷時兩兩比較相鄰元素&#xff0c;如果順序不對則交換&#xff0c;直到整個序列有序為止。 public class BubbleSort {public static void bubbleSort(int[] arr) …

圖書管理系統(附源碼)

前言&#xff1a;前面一起和小伙伴們學習了較為完整的Java語法體系&#xff0c;那么本篇將運用這些知識連串在一起實現圖書管理系統。 目錄 一、總體設計 二、書籍與書架 書籍&#xff08;Book&#xff09; 書架&#xff08;Booklist&#xff09; 三、對圖書的相關操作 I…

已解決問題 | 該擴展程序未列在 Chrome 網上應用店中,并可能是在您不知情的情況下添加的

在Chrome瀏覽器中&#xff0c;如果你看到“該擴展程序未列在 Chrome 網上應用店中&#xff0c;并可能是在您不知情的情況下添加的”這樣的提示&#xff0c;通常是因為該擴展程序沒有通過Chrome網上應用店進行安裝。以下是解決這個問題的步驟&#xff1a; 解決辦法&#xff1a;…

Spring Boot整合Redis緩存的最佳實踐

Spring Boot整合Redis緩存的最佳實踐 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在現代應用開發中&#xff0c;緩存是提升系統性能和響應速度的關鍵技術之…

kali/ubuntu安裝vulhub

無須更換源&#xff0c;安裝docker-compose apt install docker.io docker -vdocker-compose #提示沒有&#xff0c;輸入y安裝mkdir -p /etc/docker vi /etc/docker/daemon.json #更換dockerhub國內源┌──(root?kali)-[/home/kali/vulhub-master/tomcat/CVE-2017-12615] …

【VScode】常規插件安裝

以下是VScode常規插件安裝&#xff1a; C/C C/C extension pack C/C themes Draw.io integration highlight 以上插件安裝完畢后&#xff0c;可實現 字體高亮&#xff0c;自動補齊&#xff0c;函數跳轉&#xff0c;主題切換&#xff0c;圖表生成等常用功能。

中介子方程三十七

XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXηXiXXnXXyXηXyXXnXXiXηXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXηXiXXnXXyXηXyXXnXXiXηXKXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXKXηXiXXnXXyXηXyXXnXXiXηXKXXpXuXXαXXrXXdXXuXXW…

【TensorFlow深度學習】對比學習的核心:實例與上下文的對抗

對比學習的核心&#xff1a;實例與上下文的對抗 對比學習概述實例與上下文的對抗&#xff1a;核心機制實戰代碼示例&#xff1a;使用PyTorch實現SimCLR結語 在深度學習的浩瀚星海中&#xff0c;對比學習作為自我監督學習的一個分支&#xff0c;正以破竹之勢引領著無標注數據利用…

dledger原理源碼分析系列(三)-選主

簡介 dledger是openmessaging的一個組件&#xff0c; raft算法實現&#xff0c;用于分布式日志&#xff0c;本系列分析dledger如何實現raft概念&#xff0c;以及dledger在rocketmq的應用 本系列使用dledger v0.40 本文分析dledger的選主 關鍵詞 Raft Openmessaging 心跳/選…

SpringMVC中的異常處理器

文章目錄 12異常處理器12.1基于配置的異常處理HandlerExceptionResolver接口直接在springmvc中聲明使用 12.2基于注解的異常處理需要書寫異常的配置類 12異常處理器 12.1基于配置的異常處理 HandlerExceptionResolver接口 接口實現類&#xff1a; DefaultHandlerExceptionR…

Linux安裝redis教程(超級詳細,新手必看)

環境&#xff1a; Centos 7.9 一、安裝準備工作 1.配置gcc 安裝redis前需要配置gcc&#xff1a; yum install gcc如果配置gcc出現依賴包問題&#xff0c;可以到主頁查看帖子解決&#xff1a;https://blog.csdn.net/m0_59117906/article/details/134451622?spm1001.2014.300…

這四款軟件很好用,可以提升工作、學習效率

TableConvert TableConvert是一個基于Web的在線表格轉換工具&#xff0c;能夠將多種格式的表格數據進行快速轉換。它支持將Excel、URL、HTML、JSON、CSV等格式轉換為Markdown表、CSV/TSV、XML、YAML、插入SQL、HTML、Excel和LaTeX等格式。用戶只需將表格數據粘貼到編輯器&#…

設置HTML元素的背景顏色

設置HTML元素的背景顏色 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;在本文中&#xff0c;我們將探討如何使用HTML和CSS來設置HTML元素的背景顏色。背景顏色…