web上传文件方式介绍
在web浏览器上传文件一般有以下几种方式:
form表单上传文件
原生js实现ajax上传文件
jquery实现ajax上传文件
form+iframe上传文件
其中form提交数据之后会整个刷新页面;
js通过ajax上传文件虽然不会刷新整个页面,但是他们都是通过使用formdata对象实现的,formdata对象在老版本的浏览器中并不支持;
为了兼容老版本浏览器,使用iframe方式提交;
下面几节就分别就这几种方式实现上传文件来举例说明。
1. form上传文件
这是最原始的一种方式,最开始学习web的时候就是使用这种方式提交。
注意:在form表单中如果要上传文件,一定要设置这个参数: enctype=”multipart/form-data”表示封装数据类型,把数据分成一个一个小段传输。
html代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .show-img{ display: inline-block; width: 200px; height:200px; } </style> </head> <body> <h1>form表单上传文件</h1><hr> <form action="/test/" method="POST" enctype="multipart/form-data"> <p>名称:<input type="text" name="user"></p> <p>文件:<input type="file" name="testfile"></p> <p><input type="submit" value="提交"></p> </form> {% for i in imglist %} <img class="show-img" src="/{{ i.0 }}"> {% endfor %} </body> </html>在后端要注意上传过来的文件是通过request.FILES.get()方法接收的。
后端代码:
def test(req): if req.method=="GET": imglist=models.Img.objects.all().values_list("img_path") return render(req,"test.html",{"imglist":imglist}) elif req.method=="POST": user=req.POST.get("user") file=req.FILES.get("testfile") path=os.path.join("static","imgs",file.name) with open(path,"wb") as f: for chunk in file.chunks(): f.write(chunk) print(user,file.name,file.size) models.Img.objects.create(img_path=path) return redirect("/test/")2. 原生js实现ajax上传文件
js源码:
document.getElementById("js_post").onclick=function(){ var xml=new XMLHttpRequest(); var data=new FormData; //创建formdata对象 data.append("testfile",document.getElementById("file_upload").files[0]);//找到对象之后的file[0]对应的就是文件对象 xml.open("POST","/test/",true); xml.onreadystatechange=function(){ if(xml.readyState==4 && xml.status==200){ //判断状态到4了并且返回状态码是200时才做操作 var rsp_data=JSON.parse(xml.responseText); //反序列化 if (rsp_data.state){ var url="/"+rsp_data.data; //拼接路径 var obj=document.createElement("img"); //创建标签 obj.className="show-img"; //给标签加样式 obj.src=url; //给标签加url document.getElementById("imgs").appendChild(obj); } } }; xml.send(data) }html源码:
<hr><h1>ajax上传文件</h1><hr> <p>文件:<input id="file_upload" type="file" name="testfile"></p> <p><button id="js_post">原生js提交</button> <button id="jquery_post">jquery提交</button></p> <div id="imgs"> {% for i in imglist %} <img class="show-img" src="/{{ i.0 }}"> {% endfor %} </div>后端源码:
def test(req): if req.method=="GET": imglist=models.Img.objects.all().values_list("img_path") return render(req,"test.html",{"imglist":imglist}) elif req.method=="POST": user=req.POST.get("user",None) file=req.FILES.get("testfile") path=os.path.join("static","imgs",file.name) with open(path,"wb") as f: for chunk in file.chunks(): f.write(chunk) print(user,file.name,file.size) models.Img.objects.create(img_path=path) # return redirect("/test/") msg={"code":200,"state":True,"data":path} return HttpResponse(json.dumps(msg))注意:FormData对象在添加文件对象的时候并不是把标签直接给append进去,而是找到标签之后.file(0)才是文件对象
3. jquery实现ajax上传文件
这里的html代码和后端代码相对上面没有改变,这里就不列出来了。
jquery代码:
$("#jquery_post").on("click",function(){ var data=new FormData; data.append("testfile",document.getElementById("file_upload").files[0]); $.ajax({ url:"/test/", type:"POST", dataType:"JSON", data:data, contentType: false, processData: false, success:function(rst){ if(rst.state){ var url="/"+rst.data; $('<img class="show-img" src="'+url+'">').appendTo("#imgs") } } }) })注意:jquery的ajax会自动把我们的数据转换成字符串,不想转换时需要在ajax里面写入:contentType: false,processData: false,
4. form+iframe构造请求上传文件
html代码:
<hr><h1>form+iframe上传文件</h1><hr> <p><iframe id="uploadfile" name="uploadfile" style="display: none"></iframe></p> <!--注意这里的name要和form中的target一致--> <form target="uploadfile" action="/test/" method="POST" enctype="multipart/form-data"> <p>名称:<input type="text" name="user"></p> <p>文件:<input type="file" name="testfile"></p> <p><input type="submit" value="提交"></p> </form> <div id="imgs"> {% for i in imglist %} <img class="show-img" src="/{{ i.0 }}"> {% endfor %} </div>注意:这里的iframe的name的值一定要和form的target的值一样,这样才能实现绑定
js代码:
$("#uploadfile").on("load",function(){ //iframe里面有个方法是onload,当上传数据成功之后服务器返回数据时才会触发该事件 var rst=JSON.parse(this.contentDocument.body.textContent);//拿到iframe里面的内容需要通过contentDocument才能拿到里面的dom对象 if (rst.state){ var url="/"+rst.data; $('<img class="show-img" src="'+url+'">').appendTo("#imgs") } })注意:拿到iframe里面的内容需要通过contentDocument才能拿到里面的dom对象
经过实际检测,当鼠标点击提交速度比较快时,js通过ajax提交数据没有问题,但是iframe就无法提交所有数据。。。
原因是ajax是异步加载的,而iframe更像是通过浏览器打开了一个新标签,等待服务端传输回来的数据。所以,当提交速度过快时无法达到相应的效果。
使用iframe的唯一一个好处目前来看也就是兼容老版本的浏览器罢了。。。
随着时间的流逝,这种方式终将被淘汰。
参考:https://www.cnblogs.com/huxianglin/p/6175678.html
2025开年,AI技术打得火热,正在改变前端人的职业命运:
阿里云核心业务全部接入Agent体系;
字节跳动30%前端岗位要求大模型开发能力;
腾讯、京东、百度开放招聘技术岗,80%与AI相关……
大模型正在重构技术开发范式,传统CRUD开发模式正在被AI原生应用取代!
最残忍的是,业务面临转型,领导要求用RAG优化知识库检索,你不会;带AI团队,微调大模型要准备多少数据,你不懂;想转型大模型应用开发工程师等相关岗,没项目实操经验……这不是技术焦虑,而是职业生存危机!
曾经React、Vue等热门的开发框架,已不再是就业的金钥匙。如果认为会调用API就是懂大模型、能进行二次开发,那就大错特错了。制造、医疗、金融等各行业都在加速AI应用落地,未来企业更看重能用AI大模型技术重构业务流的技术人。
如今技术圈降薪裁员频频爆发,传统岗位大批缩水,相反AI相关技术岗疯狂扩招,薪资逆势上涨150%,大厂老板们甚至开出70-100W年薪,挖掘AI大模型人才!
不出1年 “有AI项目开发经验”或将成为前端人投递简历的门槛。
风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!
大模型目前在人工智能领域可以说正处于一种“炙手可热”的状态,吸引了很多人的关注和兴趣,也有很多新人小白想要学习入门大模型,那么,如何入门大模型呢?
下面给大家分享一份2025最新版的大模型学习路线,帮助新人小白更系统、更快速的学习大模型!
2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享**
一、2025最新大模型学习路线
一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。
我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。
L1级别:AI大模型时代的华丽登场
L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。
L2级别:AI大模型RAG应用开发工程
L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。
L3级别:大模型Agent应用架构进阶实践
L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。
L4级别:大模型微调与私有化部署
L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。
整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。
二、大模型经典PDF书籍
书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)
三、大模型视频教程
对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。
四、大模型项目实战
学以致用,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。
五、大模型面试题
面试不仅是技术的较量,更需要充分的准备。
在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享