应用:
登录注册时头像的图片预览:
1 伪ajax 提交文件,后台接收后返回文件路径,伪ajax更新src 提供预览,第二次提交数据时,提交头像的路径。小bug是后台必须临时保存上传的头像文件
<form id='f1' action="/register1/" method="post" target="ifr" enctype="multipart/form-data" novalidate>
{% csrf_token %}
<iframe id="ifr" name="ifr"></iframe>
<input id='i1' type="file" onchange="uploadimg()" name="avator">
<img id='avator' src="/static/img/avatar.png">
</form>
//伪ajax上传文件
function uploadimg(){
document.getElementById('f1').submit();
document.getElementById('ifr').onload=ShowImg;
}
function ShowImg(){
var content=document.getElementById('ifr').contentWindow.document.body.innerText;
document.getElementById('avator').src='/'+content;
var tag=document.createElement('input');
console.log(content);
tag.name='avator_path';
tag.value='/'+content;
tag.style.display='none';
document.getElementById('submit_form').appendChild(tag)
}
def register1(request):
avator_obj = request.FILES.get('avator')
file_path = os.path.join('static', 'img', avator_obj.name)
with open(file_path, 'wb') as f:
for chunk in avator_obj.chunks():
f.write(chunk)
return HttpResponse(file_path)
2 原生ajax提交文件(获取CSRF)formdata ,后台接收后返回文件路径,ajax更新src 提供预览,第二次提交数据 时,提交头像的路径
3 本地上传预览,不用提交到后台,提供预览功能,在提交数据时,一起提交头像的文件数据
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <form class="form-horizontal" id='submit_form' method="post" action="/register/" novalidate enctype="multipart/form-data"> 2 {% csrf_token %} 3 <div> 4 <img id='avatar1' src="/static/img/avatar.png" > 5 {# <input type="file" id="imgselect">#} 6 {{ obj.avator }}{{ obj.errors.avator.0 }} 7 </div> 8 </form> 9 10 11 $(function(){ 12 bindAvatar() 13 }); 14 15 function bindAvatar(){ 16 if(window.URL.createObjectURL){ 17 bindAvatar2(); 18 }else if(window.FileReader){ 19 bindAvatar3() 20 }else{ 21 bindAvatar1() 22 } 23 } 24 //原生ajax上传文件 25 function bindAvatar1(){ 26 $('#imgselect').change(function(){ 27 var csrf=$('input[name="csrfmiddlewaretoken"]').val(); 28 29 var formdata=new FormData(); 30 formdata.append('avator',$(this)[0].files[0]); 31 formdata.append("csrfmiddlewaretoken",csrf); 32 33 var xhr=new XMLHttpRequest(); 34 xhr.onreadystatechange=function () { 35 if (xhr.readyState==4){ 36 var file_path=xhr.responseText; 37 document.getElementById('avatar1').src='/'+file_path; 38 } 39 }; 40 xhr.open('POST','/register1/'); 41 xhr.send(formdata) 42 }) 43 } 44 //本地上传预览 45 function bindAvatar2() { 46 $('#imgselect').change(function(){ 47 var obj=$(this)[0].files[0]; 48 49 var v=window.URL.createObjectURL(obj); 50 $('#avatar1').attr('src',v); 51 $('#avatar1').load(function () { 52 window.URL.revokeObjectURL(v); 53 }) 54 }) 55 } 56 57 function bindAvatar3(){ 58 var obj=$(this)[0].files[0]; 59 var reader= new FileReader(); 60 reader.onload=function (e) { 61 $('#avatar1').attr('src',this.result); 62 }; 63 reader.readAsDataURL(obj); 64 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def register(request): 2 if request.method=='GET': 3 obj=registerForm(request) 4 return render(request,'register.html',{'obj':obj}) 5 6 else: 7 # 第一种方案:伪ajax提交用户头像信息 8 # session_code = request.session.get('code') 9 # #获取form组件生成的标签的值 10 # obj = registerForm(request.POST) 11 # #获取伪ajax生成的input标签的值(用户头像) 12 # avator_path=request.POST.get('avator_path') 13 # if obj.is_valid(): 14 # code=obj.cleaned_data.pop('code') 15 # #判断验证码信息 16 # if session_code.upper()==code.upper(): 17 # #向clean_data中加入一个键值对,存放用户头像信息 18 # obj.cleaned_data['avator']=avator_path 19 # #更新数据库 20 # models.user.objects.create(**obj.cleaned_data) 21 # return redirect('/') 22 # else: 23 # return render('register.html',{'msg': '验证码错误'}) 24 # else: 25 # return render(request, 'register.html', {'obj': obj}) 26 27 28 29 #第二种方案:本地预览头像,在form组件生成的标签中提交头像信息 30 obj=registerForm(request,request.POST,request.FILES) 31 if obj.is_valid(): 32 obj.cleaned_data.pop('code') 33 obj.cleaned_data.pop('password2') 34 models.user.objects.create(**obj.cleaned_data) 35 return redirect('/') 36 else: 37 return render(request, 'register.html', {'obj': obj})