<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .upload { display: inline-block; background-color: #ef4300; cursor: pointer; width: 100px; height: 35px; text-align: center; position: absolute; line-height: 35px; top: 0; bottom: 0; right: 0; left: 0; z-index: 99; } .file { width: 100px; height: 35px; text-align: center; position: absolute; line-height: 35px; top: 0; bottom: 0; right: 0; left: 0; z-index: 100; opacity: 0; } </style> </head> <body> <div style="position: relative;width: 100px;height: 35px"> <input type="file" id="i1" name="upload" class="file"> <a class="upload">上传</a> </div> <input type="submit" value="xhr提交" onclick="xhrSubmit();"> <input type="submit" value="ajax提交" onclick="ajaxSubmit();"> <script src="/static/jquery-1.12.4.js"></script> <script src="/static/jquery.cookie.js"></script> <form action="/xiaoqing/upload_file/" method="post" target="ifm1" enctype="multipart/form-data"> {% csrf_token %} <iframe id="ifm2" name="ifm1"></iframe> <input type="file" name="upload"> <input type="submit" onclick="iframesubmitForm();" value="Form提交" > </form> <script> var csrftoken = $.cookie('csrftoken'); //第一种上传方式 iframe function iframesubmitForm() { $('#ifm2').load(function(){ var text= $('#ifm2').contents().find('body').text(); var obj= JSON.parse(text); console.log(obj); }) } //第二种上传方法 ajax function ajaxSubmit() { var fileobj = document.getElementById('i1').files[0]; console.log(fileobj); var fd = new FormData(); //依赖FormData对象 fd.append('username', 'root'); fd.append('upload', fileobj); $.ajax({ url: '/xiaoqing/upload_file/', type: 'POST', data: fd, processData: false, cententType: false, headers: {'X-CSRFtoken': csrftoken}, success: function(arg,a1,a2){ console.log(arg); console.log(a1); console.log(a2); } }) } //第三种上传方法 xhr对象 function xhrSubmit() { var fileobj = document.getElementById('i1').files[0]; console.log(fileobj); var fd = new FormData(); //依赖FormData对象 fd.append('username','root'); fd.append('upload',fileobj); var xhr= new XMLHttpRequest(); //创建对象 xhr.open('POST','/xiaoqing/upload_file/',true); xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset-UTF-8'); //POST请求必须设置 xhr.setRequestHeader('X-CSRFtoken',csrftoken); xhr.send(fd); xhr.onreadystatechange = function() { if(xhr.readyState == 4){ var obj = JSON.parse(xhr.responseText); //返回值 console.log(obj); } } } </script> </body> </html>
def upload(request): return render(request,'upload.html') def upload_file(request): username=request.POST.get('username') upload_obj=request.FILES.get('upload') print(upload_obj) print(username) import os upload_path=os.path.join('uploads',upload_obj.name) with open(upload_path,'wb+') as f: for item in upload_obj.chunks(): f.write(item) ret = {'status':True,'data':request.POST.get('username')} return HttpResponse(json.dumps(ret))
上传预览
如果发送的是文件建议使用iframe 因为他不依赖于其他,而jQuery(依赖FormData),XMLHttpresquest(也依赖FormData)
html
<form id="form1" action="/xiaoqing/upload_file/" method="post" target="ifm1" enctype="multipart/form-data"> {% csrf_token %} <iframe id="ifm2" name="ifm1" style="display: none"></iframe> <input type="file" name="upload" onchange="uploadChange();"> <input type="submit" onclick="iframesubmitForm();" value="Form提交" > </form> <div id="preview"></div> <script> //上传预览 function uploadChange() { #绑定onchange事件 $('#ifm2').load(function(){ var text= $('#ifm2').contents().find('body').text(); var obj= JSON.parse(text); $('#preview').empty() var img_tag=document.createElement('img'); #创建img标签 img_tag.src='/'+obj.data;$('#preview').append(img_tag); }) $('#form1').submit(); #提交表单 } //第三种上传方式预览 function iframesubmitForm() { $('#ifm2').load(function(){ var text= $('#ifm2').contents().find('body').text(); var obj= JSON.parse(text); $('#preview').empty() var img_tag=document.createElement('img'); img_tag.src='/'+ obj.data; $('#preview').append(img_tag); }) } </script>
views.py:
def upload_file(request): username=request.POST.get('username') upload_obj=request.FILES.get('upload') print(upload_obj) print(username) import os image_path=os.path.join('static/imgs',upload_obj.name) # upload_path=os.path.join('uploads',upload_obj.name) with open(image_path,'wb') as f: for item in upload_obj.chunks(): f.write(item) ret = {'status':True,'data':image_path} return HttpResponse(json.dumps(ret)) #返回image_path路径