前端上传文件
<form method="POST" enctype="multipart/form-data"> <input type="file" name="file" value="请选择文件"><br /> <input type="submit"> </form>
上面的form表单上传会造成页面整页刷新
上面的相比于Form表单的提交,使用了浏览器的XMLHttpRequest自定义的提交方式,也就是俗称的AJAX技术。但是使用这种提交方式没有设置编码 enctype="multipart/form-data" 类型,如果直接将文件内容上传,会导致后端在解析Form表单上传的文件时与Ajax上传的不一致,所以为了后端能够使用相同的代码就能解析前端这两种提交方式,所以前端需要自行格式化文件内容。在格式化的过程中,则需要通过浏览器自身提供的FormData构造函数来实例化的一个文件fd,然后使用实例的append方法将文件内容插入进去,最后利用XMLHttpRequest的实例做出发送动作。所以最终上传部分应为如下代码:
<div> <input id="file" type="file" /> <input type="button" value="文件上传" onclick="uploadFile()" /> </div> <script> function uploadFile() { const file = document.getElementById('file').files[0]; const xhr = new XMLHttpRequest(); const fd = new FormData(); fd.append('file', file); xhr.open('POST', 'http://127.0.0.1:8000/upload', true); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { alert(xhr.responseText); } }; xhr.send(fd); } </script>
一个简单的解析器完成了,一般情况下你所使用的框架会解决解码这一部分问题,无论是Nodejs或是Java,他们的本质都是摘出有效的文件内容然后写进新文件里,从而达到文件上传的目的。
最终的服务端代码如下:
if(url ==='/upload' && method === 'POST') { //文件类型 const arr = [] req.on('data', (buffer) => { arr.push(buffer); }) req.on('end', () => { const buffer = Buffer.concat(arr); const content = buffer.toString(); const result = decodeContent(content); const fileName = content.match(/(?<=filename=").*?(?=")/)[0]; fileStream(fileName).write(result); res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); res.end('上传完成') }) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)