Python 实现上传图片并预览的3种方法(推荐)
本文介绍了在 Python Web 开发中实现图片上传并预览的三种方法。第一种方法通过 Ajax 将图片上传至服务器临时目录后返回 URL 进行渲染,虽然实现简单但会消耗额外的服务器资源。第二种方法利用 `window.FileReader` 在本地内存中生成 Base64 数据进行预览,兼容性好但会增加浏览器负担。第三种方法使用 `window.URL.createObjectURL` 创建本地对象 URL,性能最优且无需网络请求,但需注意低版本浏览器的兼容性问题。
实现思路与方案对比
在用户注册或资料修改页面中,通常需要提供本地选择图片(如头像)并即时预览的功能。实现这一功能主要有两种思路:一是将图片上传至服务器临时文件夹,由服务器返回 URL 进行渲染;二是在本地内存中完成预览,待用户确认提交后再将图片上传至服务器。
第一种思路虽然实现简单,但会浪费流量和服务器资源。第二种思路减轻了服务器的压力,但会加重浏览器的负担,且对浏览器的兼容性要求较高,例如低版本的 IE 浏览器不支持本地内存预览。
前端实现代码
以下代码展示了包含模板文件 `test.html` 的实现方式,其中包含了视图函数 `upload_avatar.py` 和路由系统 `urls.py` 的配合。效果包括 Ajax 上传并返回图片 URL、`window.FileReader` 本地预览以及 `window.URL.createObjectURL` 本地预览。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div >
<form action="">
{% csrf_token %}
<h3>用户注册</h3>
<p>用户名:<input type="text" name="userName"></p>
<p>密码:<input type="password" name="password"></p>
<p>邮箱:<input type="text" name="email"></p>
<input id="avatar" type="text" value="/static/images/sample.png" name="avatar" > {# 实际应用中要将该input标签隐藏,display:none; #}
<p><input type="submit" value="注册"></p>
</form>
<div >
<input id="avatarSlect" type="file" >
<img id="avatarPreview" src="/static/images/sample.png" title="点击更换图片" >
</div>
</div>
</body>
<script src="/static/jquery-3.2.1.js"></script>
<script>
$(function () {
bindAvatar();
});
function bindAvatar() {
if(window.URL.createObjectURL){
bindAvatar3();
}else if(window.FileReader){
bindAvatar2();
}else {
bindAvatar1();
}
}
/*Ajax上传至后台并返回图片的url*/
function bindAvatar1() {
$("#avatarSlect").change(function () {
var csrf = $("input[name='csrfmiddlewaretoken']").val();
var formData=new FormData();
formData.append("csrfmiddlewaretoken",csrf);
formData.append('avatar', $("#avatarSlect")[0].files[0]); /*获取上传的图片对象*/
$.ajax({
url: '/upload_avatar/',
type: 'POST',
data: formData,
contentType: false,
processData: false,
success: function (args) {
console.log(args); /*服务器端的图片地址*/
$("#avatarPreview").attr('src','/'+args); /*预览图片*/
$("#avatar").val('/'+args); /*将服务端的图片url赋值给form表单的隐藏input标签*/
}
})
})
}
/*window.FileReader本地预览*/
function bindAvatar2() {
console.log(2);
$("#avatarSlect").change(function () {
var obj=$("#avatarSlect")[0].files[0];
var fr=new FileReader();
fr.onload=function () {
$("#avatarPreview").attr('src',this.result);
console.log(this.result);
$("#avatar").val(this.result);
};
fr.readAsDataURL(obj);
})
}
/*window.URL.createObjectURL本地预览*/
function bindAvatar3() {
console.log(3);
$("#avatarSlect").change(function () {
var obj=$("#avatarSlect")[0].files[0];
var wuc=window.URL.createObjectURL(obj);
$("#avatarPreview").attr('src',wuc);
$("#avatar").val(wuc);
{# $("#avatarUrl").load(function () {#} /*当图片加载后释放内存空间,但在jQuery3.2.1中会报错。浏览器关闭后也会自动释放*/
{# window.URL.revokeObjectURL(wuc);#}
{# })#}
})
}
</script>
</html>
后端处理代码
后端视图函数 `upload_avatar.py` 负责接收上传的文件对象,并将其保存到服务器的指定目录中。路由系统 `urls.py` 则定义了相应的 URL 映射。
from django.shortcuts import render, HttpResponse
def test(request):
return render(request, 'test.html')
def upload_avatar(request):
file_obj = request.FILES.get('avatar')
file_path = os.path.join('static/images', file_obj.name)
with open(file_path, 'wb') as f:
for chunk in file_obj.chunks():
f.write(chunk)
return HttpResponse(file_path)
from django.conf.urls import url from django.contrib import admin from home import views as homeViews urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^upload_avatar/', homeViews.upload_avatar), # 上传头像 url(r'^test/', homeViews.test), # 测试页面 ]




总结
通过上述三种方法,我们可以根据实际需求选择合适的图片上传和预览方案。第一种方法适用于对服务器资源不敏感的场景,第二种方法适用于需要兼容低版本浏览器的场景,第三种方法则适用于对性能要求较高的现代浏览器环境。
以上就是 python 实现上传图片并预览的3种方法(推荐)的详细内容,更多关于 python 图片上传的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









