Python 实现上传图片并预览的3种方法(推荐)

云舒
云舒
发布时间:2026-10-12 | 5人浏览过
原创

本文介绍了在 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 图片上传的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表