当前位置: 首页 > article >正文

文件上传1

在日常使用各类网站、APP 的过程中文件上传是我们每天都会接触的基础功能更换社交账号头像、发布朋友圈配图、上传学习文档、提交作业文件、上传博客封面图…… 这些场景背后都是Web 文件上传技术在支撑。一、文件上传核心原理解读在动手写代码之前我们一定要先搞明白文件上传到底是一个怎样的流程浏览器和服务器之间是如何传输文件的 只有理解原理后续写代码时才能知其然更知其所以然遇到问题也能快速排查。简单来说Web 文件上传就是前端浏览器把用户本地的文件通过网络请求发送给后端服务器服务器接收文件并完成存储的过程这个过程分为五个关键步骤环环相扣前端发起请求用户在网页上选择本地文件点击上传按钮浏览器开始构建上传请求请求格式封装浏览器会把文件数据按照特定格式multipart/form-data进行封装这是传输文件的专属格式普通文本请求无法传输文件后端接收请求后端服务器监听上传接口接收到浏览器发送的文件请求文件校验与处理后端对接收的文件进行校验文件是否存在、类型是否合法、大小是否超标校验通过后将文件保存到服务器指定位置结果返回反馈后端向浏览器返回上传成功或失败的提示前端展示结果给用户。这里有一个核心关键点文件上传和普通的文本表单提交完全不同普通表单提交文字、数字数据用默认格式即可但文件属于二进制数据流必须使用特定的请求编码格式和请求方式缺一不可1. 必备工具安装VS Code作为代码编辑器也是我们全程使用的开发工具界面简洁、操作方便直接官网下载安装即可Python 环境因为我们选用 Python Flask 框架做后端安装 Python 时记得勾选 “Add Python to PATH”自动配置环境变量。2. Flask 框架安装Flask 是 Python 的轻量级 Web 框架只需要一行命令就能完成安装。打开 VS Code 的终端顶部菜单栏【终端】→【新建终端】输入以下命令并回车pip install flask等待安装完成没有报错就说明环境准备就绪接下来就可以开始编写代码。3. 项目文件结构规划为了让项目结构清晰、方便管理我们提前规划好文件目录后续创建文件时直接对应即可不需要额外创建文件夹代码会自动生成plaintext文件上传项目/ ├─ index.html # 前端上传页面用户操作的界面 ├─ app.py # 后端服务代码处理文件上传逻辑 └─ uploads/ # 自动生成的文件夹用于存储上传的文件二、前端页面开发打造美观易用的上传界面前端是用户直接接触的部分主要实现文件选择、本地预览、提交上传三个功能我们用 HTML 搭建页面结构CSS 简单美化页面JavaScript 实现本地预览效果让用户选择文件后就能直接看到预览图提升使用体验。完整前端代码index.html!DOCTYPEhtml langheadmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0 零基础文件上传教程!DOCTYPE htmlhtml langzh-CNheadmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0title文件上传/titlestyle* {margin: 0;padding: 0;box-sizing: border-box;font-family: Microsoft YaHei, sans-serif;}body {max-width: 700px;margin: 60px auto;padding: 0 25px;background-color: #f5f7fa;}h1 {text-align: center;color: #333;margin-bottom: 40px;font-size: 26px;}.upload-container {background-color: #fff;padding: 50px 30px;border-radius: 12px;box-shadow: 0 2px 15px rgba(0,0,0,0.08);}.upload-area {border: 2px dashed #dcdcdc;padding: 50px 20px;text-align: center;border-radius: 8px;margin-bottom: 30px;transition: all 0.3s ease;}.upload-area:hover {border-color: #007bff;background-color: #f8f9ff;}.upload-area h3 {color: #555;margin-bottom: 25px;font-weight: normal;}input[typefile] {margin: 20px 0;padding: 8px;cursor: pointer;}.submit-btn {background-color: #007bff;color: #fff;border: none;padding: 12px 35px;border-radius: 6px;font-size: 16px;cursor: pointer;transition: background-color 0.3s ease;}.submit-btn:hover {background-color: #0056b3;}.preview-box {margin-top: 30px;text-align: center;display: none;}.preview-box h3 {color: #333;margin-bottom: 20px;}.preview-box img {max-width: 320px;border-radius: 8px;box-shadow: 0 2px 10px rgba(0,0,0,0.1);}/style/headbodyh1Web文件上传功能/h1div classupload-containerdiv classupload-areah3请选择需要上传的图片文件/h3form action/upload methodpost enctypemultipart/form-datainput typefile idfileBtn namefile acceptimage/*brbutton typesubmit classsubmit-btn确认上传/button/formdiv classpreview-box idpreviewh3文件本地预览/h3img idpreviewImg src alt预览图片/div/div/divscriptconst fileInput document.getElementById(fileBtn);const previewBox document.getElementById(preview);const previewImg document.getElementById(previewImg);fileInput.addEventListener(change, function() {if (this.files this.files[0]) {const fileUrl URL.createObjectURL(this.files[0]);previewImg.src fileUrl;previewBox.style.display block;}});/script/body/html前端核心代码详细讲解表单核心属性重中之重methodpost文件上传必须使用 POST 请求方式GET 请求只能传输少量文本数据无法承载文件的二进制数据流这是硬性规定enctypemultipart/form-data设置表单的编码格式专门用于传输文件不加这个属性后端永远无法接收到前端发送的文件是新手最容易遗漏的关键点action/upload指定表单提交的后端接口地址后端需要监听这个地址处理上传逻辑namefile文件选择框的名称后端通过这个名称获取文件数据前后端名称必须完全一致。文件类型限制acceptimage/*前端限制用户只能选择图片类型文件从源头减少无效上传不过前端限制只能起到辅助作用后端必须再次做校验防止用户绕过前端限制上传恶意文件。本地预览功能通过 JavaScript 监听文件选择事件使用URL.createObjectURL()方法生成文件的临时本地链接将这个链接赋值给图片标签就能实现选择文件后立即预览不需要等待上传到服务器大幅提升用户体验这个方法也是前端文件预览的常用方案。三、后端服务开发处理文件上传与存储逻辑前端负责把文件发送给后端后端则负责接收文件、校验文件、保存文件、返回结果这是文件上传的核心环节同时还要做好安全校验避免服务器被恶意文件攻击。完整后端代码app.py# 导入Flask核心模块和请求模块from flask import Flask, request# 导入系统文件操作模块import os# 初始化Flask应用是Flask项目的固定写法app Flask(__name__)# 1. 配置文件上传后的存储路径UPLOAD_PATH ./uploads# 自动创建uploads文件夹exist_okTrue表示文件夹已存在时不报错os.makedirs(UPLOAD_PATH, exist_okTrue)# 2. 配置上传文件的最大大小16MB防止超大文件占用服务器资源# 计算方式1MB 1024KB1KB 1024字节16*1024*1024就是16MB的字节数app.config[MAX_CONTENT_LENGTH] 16 * 1024 * 1024# 3. 定义首页路由用户访问根路径时返回前端上传页面app.route(/)def index():# 读取并返回index.html页面内容encodingutf-8防止中文乱码with open(index.html, r, encodingutf-8) as f:return f.read()# 4. 定义文件上传接口路由仅接收POST请求与前端form表单action对应app.route(/upload, methods[POST])def upload_file():# 第一步从请求中获取前端发送的文件对象# get方法防止未获取到文件时报错更稳健file request.files.get(file)# 第二步文件校验一判断用户是否选择了文件if not file or file.filename h3上传失败您未选择任何文件请重新选择/h3a href/返回上传/a# 第三步文件校验二校验文件类型仅允许上传图片# 定义允许上传的文件后缀集合allowed_suffix {png, jpg, jpeg, gif, bmp}# 获取文件后缀名分割文件名并转小写避免大小写问题if . in file.filename:file_suffix file.filename.rsplit(., 1)[-1].lower()else:file_suffix # 判断文件后缀是否在允许列表中if file_suffix not in allowed_suffix:h3上传失败仅支持上传png/jpg/jpeg/gif/bmp格式图片/h3a href/返回上传页/a# 第四步拼接文件保存路径防止不同系统路径格式冲突save_file_path os.path.join(UPLOAD_PATH, file.filename)# 第五步保存文件到服务器指定路径file.save(save_file_path)# 第六步返回上传成功结果给用户明确提示return fdiv styletext-align:center; margin-top:50h3 stylecolor:#28a745;/h3p上传文件名{file/pp文件存储路径{save_file_path}/pa href/ stylecolor:#007bff; text-decoration:none;继续上传文件/p/div# 启动Flask服务if __name__ __main__:# debugTrue开发模式修改代码后自动重启服务host0.0.0.0允许局域网访问app.run(debugTrue, host0.0.0.0, port5000)后端核心逻辑详细讲解路径配置与文件夹创建我们指定服务器存储文件的路径为项目下的uploads文件夹通过os.makedirs()自动创建文件夹不需要手动新建避免因文件夹不存在导致上传失败。文件大小限制通过MAX_CONTENT_LENGTH配置最大上传大小这里设置为 16MB可根据实际需求调整限制文件大小是为了防止用户上传超大文件导致服务器内存溢出、存储空间爆满。多层文件校验安全核心校验是否选择文件避免空请求占用服务器资源校验文件类型只允许指定格式的文件上传绝对不能省略如果不做校验用户可能上传 exe 可执行文件、脚本病毒等导致服务器被入侵后缀名转小写避免.JPG、PNG等大写后缀无法通过校验提升兼容性。文件保存逻辑使用os.path.join()拼接文件路径这个方法可以自动适配 Windows、Mac、Linux 系统的路径格式避免跨系统报错再通过 Flask 内置的save()方法直接将文件保存到指定位置。

相关文章:

文件上传1

在日常使用各类网站、APP 的过程中,文件上传是我们每天都会接触的基础功能:更换社交账号头像、发布朋友圈配图、上传学习文档、提交作业文件、上传博客封面图…… 这些场景背后,都是Web 文件上传技术在支撑。一、文件上传核心原理解读在动手写…...

LVGL + SquareLine:嵌入式里「中英两套字串」怎么做(无需完整 i18n 框架)

LVGL + SquareLine:嵌入式里「中英两套字串」怎么做(无需完整 i18n 框架) 适用场景:ESP-IDF + LVGL,界面由 SquareLine Studio 生成;不想维护字符串 ID、gettext、.po 那一套,只希望 中文默认 UI + NVS 记忆语言 + 进屏刷新,英文尽量短以适应小屏。 1. 为什么不搞「正经…...

招聘类 Android 应用开发全栈实践与性能优化

引言 移动互联网时代,招聘平台已成为连接人才与企业的核心桥梁。作为 Android 开发工程师,负责招聘类应用的研发工作,不仅要求扎实的底层技术功底,更需要深刻理解招聘场景下的业务逻辑、用户交互特性以及对性能与稳定性的极致追求。本文将围绕一个招聘类 Android 应用从 0…...

Windows系统安装Node.js教程

Windows系统安装Node.js教程 本文档详细介绍了在Windows系统上安装Node.js的完整步骤,包括下载、安装和验证过程,帮助用户快速搭建Node.js开发环境。 一、Node.js 简介 Node.js 是一个基于 Chrome V8 引擎构建的开源、跨平台 JavaScript 运行时环境,它允许开发者在服务器…...

tinyalsa(0)

先给你一个完整配置 采样率(rate) 48000 声道数(channels) 2(左右声道) 采样格式 16bit(2字节) period_size 480 period_count 4一、先从“声音本…...

数据科学中的Pandas数据框扩展

在数据科学和机器学习的领域中,处理数据结构往往是日常工作的一部分。尤其是当我们需要处理图结构数据时,构建和操作邻接矩阵是常见任务之一。Pandas作为Python中处理数据的强大工具,提供了许多便捷的方法来操作数据框(DataFrame)。本文将探讨如何使用Pandas高效地扩展数据…...

龙虾量化实战法(QClaw)

龙虾量化上手法 如果你只是想快速搭一套能用的量化分析流程,这篇文章就是写给你的。最近市面上这类量化课程真的很多,讲得热闹,卖得也凶,但我个人一直不觉得这东西有多大价值。原因很简单,很多课讲到最后,还…...

关于FLOPs与MACs的说明

关于FLOPs与MACs的说明: 尽管通常被称为"FLOPs",但fvcore的FlopCountAnalysis返回的值实际上代表的是MACs(乘加运算次数)。 正如FlopCountAnalysis的文档字符串(第53行)所述:“我们将…...

算法学习第七天

1. 环形链表 II 总结链表与数组的适用场景差异,提交第一周学习小结 题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,使用整数 pos…...

OpenCore Legacy Patcher终极解决方案:4步完整技术指南让旧Mac焕发新生

OpenCore Legacy Patcher终极解决方案:4步完整技术指南让旧Mac焕发新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是…...

Unity URP 实战:基于Kajiya-Kay与Marschner的头发着色器深度解析

1. 头发渲染为什么这么难? 第一次尝试做头发渲染的时候,我对着屏幕发呆了整整一天。为什么游戏里的头发看起来总是那么假?这个问题困扰了我很久。后来才发现,头发的光学特性比我们想象中复杂得多 - 每根头发实际上是个微型圆柱体&…...

基于c/c++实现linux/windows跨平台ntp时间戳服务器

目录使用场景c/c源码结果验证windows编译命令linux编译命令服务器输出结果客户端输出结果使用场景 在某些严格要求时间同步很精准的项目中,获取网络ntp时间的时间延时比较大,做滤波处理可能效果也不理想。因此可以搭建一个本地ntp服务器,这样…...

如何快速上手NVIDIA Profile Inspector:新手必看的完整显卡优化教程

如何快速上手NVIDIA Profile Inspector:新手必看的完整显卡优化教程 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 想彻底释放你的NVIDIA显卡性能吗?NVIDIA Profile Inspector正…...

做再生牛津布出口的靠谱公司有哪些?

做再生牛津布出口,想找个靠谱的伙伴,这事儿我太有感触了。 在这个行业里泡了五年,看过太多品牌方和采购朋友踩坑。要么是环保认证搞不定,货到了港口被卡住;要么是面料性能不达标,看着挺“绿”,用…...

对话式革新:OpenClaw全场景实战指南(含CloudBase开发全流程\+生态深度解析)

在AI原生工具爆发的2026年,鹅厂OpenClaw以“文本驱动、本地优先、事件编排”的核心优势,打破了传统AI助手“只建议、不执行”的局限,从单一工具升级为覆盖办公、创作、学习、研发等多场景的生态体系。它并非简单的对话机器人,而是…...

大学生如何准备AI面试

前两天一个学弟找我,说他投了十几家AI公司的算法岗,全军覆没。 他简历上写的是「熟悉Transformer架构」、「掌握PyTorch」、「参与过NLP相关项目」,看起来没什么毛病,但面试官一开口就问,「你训练过一个模型从零到上线…...

在国产麒麟系统上,手把手教你离线搞定osg3.4.0和osgEarth2.9的编译(附完整依赖包)

国产麒麟系统离线编译OSG 3.4.0与osgEarth 2.9全流程指南 在信创产业快速发展的背景下,国产操作系统与硬件平台正逐步成为关键基础设施的核心选择。银河麒麟作为国产操作系统的代表之一,其稳定性和安全性已得到广泛验证。然而,在三维地理信息…...

大模型时代最后的符号堡垒,正在崩塌?——全球首份AGI融合技术成熟度评估报告(Gartner未发布版节选)

第一章:大模型时代最后的符号堡垒,正在崩塌? 2026奇点智能技术大会(https://ml-summit.org) 符号主义曾是人工智能的基石——逻辑推理、形式化验证、可解释规则系统,构成了人类对“智能”的最初建模。然而,当大语言模…...

【2024 AGI迁移学习权威白皮书】:基于172个跨模态任务实测数据,揭示仅12.6%模型具备真正泛化迁移能力

第一章:AGI跨领域迁移学习能力的定义与核心挑战 2026奇点智能技术大会(https://ml-summit.org) AGI跨领域迁移学习能力,指通用人工智能系统在未经历显式训练的前提下,将从源任务(如自然语言理解)中习得的抽象表征、推…...

AGI武器化临界点已至:全球7国军方内部评估报告泄露,5个致命伦理漏洞亟待封堵

第一章:AGI武器化临界点的现实判定与战略警示 2026奇点智能技术大会(https://ml-summit.org) 当前,AGI武器化已脱离理论推演阶段,进入可实证观测的临界演化窗口。多国军事AI项目披露的自主决策延迟数据、开源大模型在红蓝对抗环境中生成战术…...

自指宇宙学研究大纲:存在如何通过自我描述而实在化(世毫九实验室原创理论)

自指宇宙学研究大纲:存在如何通过自我描述而实在化 作者:方见华 单位:世毫九实验室 1. 引言与理论背景 1.1 研究动机与问题提出 当代物理学面临着前所未有的理论困境。粒子物理标准模型与广义相对论在各自领域取得了极致成功,却始…...

Switch手柄在电脑上玩转PC游戏:BetterJoy功能详解与实战指南

Switch手柄在电脑上玩转PC游戏:BetterJoy功能详解与实战指南 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcod…...

【maaath】Flutter for OpenHarmony 国际化集成指南:实现中英文动态切换

Flutter for OpenHarmony 国际化集成指南:实现中英文动态切换 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net作者:maaath一、背景介绍 在移动应用开发中,国际化(Internationalization&#x…...

面试官:Skills是什么?讲一讲它的工作原理

一、标准答案参考 直接上答案:Skills本质是结构化的本地文件夹,用来补充某个领域的流程、知识和工具,让模型在相关场景下自动或按需调用,是面向大模型的能力封装。 二、扩展问题 1、Skills 和 Prompt 的区别是什么? …...

CLIP-GmP-ViT-L-14效果展示:同一张图在不同语义层级(物体/属性/关系)的排序对比

CLIP-GmP-ViT-L-14效果展示:同一张图在不同语义层级(物体/属性/关系)的排序对比 1. 模型简介 CLIP-GmP-ViT-L-14是一个经过几何参数化(GmP)微调的CLIP模型,在ImageNet和ObjectNet数据集上达到了约90%的准确率。这个模型继承了CL…...

PyTorch模型量化避坑指南:从保存的int8模型到成功加载推理,我踩了哪些坑?

PyTorch模型量化实战避坑指南:从int8保存到推理的完整解决方案 量化技术正在成为深度学习部署的标配技能,但真正把量化模型跑通的人都知道——这绝不是调用两行API就能搞定的事。上周我部署一个关键的人体姿态估计模型时,就经历了从量化保存到…...

【AGI科研加速器】:SITS2026实证揭示——3大学科突破如何被AGI在72小时内重构研究范式?

第一章:SITS2026案例:AGI辅助科学研究 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026(Singularity Intelligence Technology Summit 2026)公布的前沿案例中,“AGI辅助科学研究”项目展示了通用人工智能系…...

串口调试神器COMTransmit的隐藏功能:这样调试CH9143效率翻倍

串口调试神器COMTransmit的隐藏功能:这样调试CH9143效率翻倍 在嵌入式开发领域,串口调试就像工程师的"听诊器",而COMTransmit无疑是这把听诊器的专业升级版。许多开发者仅仅把它当作基础收发工具,却不知道其中藏着能让你…...

C++ MapViewOfFile 内存映射实战:解锁Windows大文件高效处理

1. 为什么需要内存映射技术? 如果你曾经尝试用传统方式读取几个GB的大文件,可能会遇到性能瓶颈。我做过一个实验:用fread逐块读取1GB的日志文件,耗时超过3秒;而改用内存映射方式,同样的文件仅需不到0.5秒。…...

为什么你的AI Agent响应速度总是不达标:延迟优化与性能调优实战复盘

为什么你的AI Agent响应速度总是不达标:延迟优化与性能调优实战复盘1. 引入与连接:从一场“凌晨三点的客户退单”说起 1.1 核心概念 在正式拆解AI Agent延迟问题之前,我们必须先锚定两个最核心、最容易被混淆的前置概念,并通过它们…...