• Django中的python文件上传


    一、上传到本地

    准备工作:

    models中创建表:

    class Book(models.Model):
        name = models.CharField(
            max_length=40
        )
        icon = models.ImageField(
            upload_to="icons"  # 指定文件保存的路径名 系统自动创建
        )

    settings中配置存储路径

    MEDIA_ROOT = os.path.join(BASE_DIR, "static/uploads")

    生成一个不重复的文件名:

    import uuid,hashlib
    
    def get_unique_str():
        uuid_str = str(uuid.uuid4())
        md5 = hashlib.md5()
        md5.update(uuid_str.encode('utf-8'))
        return md5.hexdigest()

    方法一(文件保存到本地和数据库):

    views视图中的写法:

    def test1(req):
        if req.method == 'GET':
            return render(req, 'mybook.html',{'book_name':book.name,'icon':icon_url})
        name = req.POST.get('name')
        myfile = req.FILES.get('icon')
        book = Book.objects.create(name=name,icon=myfile)  #将数据存储到Book表中
        return HttpResponse('OK')

    前端页面写法:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="/app/test1/" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="text" name="name" placeholder="书名"><br>
        <input type="file" name="icon"><br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>

    拼接图片的网络路径,可通过该路径在浏览器上显示出图片

     icon_url = "http://{}/static/uploads/{}".format(
                req.get_host(), #获取访问的域名加端口
                book.icon.url  #图片的路径字符串
            )

    方法二(文件保存到本地):

    views视图中的写法:

    from .myutil import get_unique_str
    def test2(req):
        if req.method == 'GET':
            return render(req,'mybook.html')
        else:
            name = req.POST.get('name')
            myfile = req.FILES.get('icon')
            filename = get_unique_str()+'.'+myfile.name.split('.')[-1]
    
            # 文件路径
            filepath = os.path.join(settings.MEDIA_ROOT,filename)
            f = open(filepath,'wb')
            for i in myfile.chunks():
                f.write(i)
            f.close()
            return HttpResponse('OK')

    前端页面的写法:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="/app/test2/" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="text" name="name" placeholder="书名"><br>
        <input type="file" name="icon"><br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>

    二、上传到oss(***)

    进入阿里云OSS管理控制台,找到以下信息

    views视图中的写法

    import oss2
    from io import BytesIO
    def upload_to_oss(req):
      if req.method == 'GET':
      return render(req,'mybook.html')

      # 将找到的信息填入下面空缺处
        endpoint = ''
        access_key_id = ''
        access_key_secret = ''
        bucket_name = ''
        bucket_name_host = ""
        # 生成一个认证对象
        auth = oss2.Auth(access_key_id, access_key_secret)
    
        bucket = oss2.Bucket(auth, endpoint, bucket_name)
    
        # 获取文件
        f = req.FILES.get("icon")
        # 实例化io
        buf = BytesIO()
        # 写入到内存
        for i in f.chunks():
            buf.write(i)
        # 调整指针到开头
        buf.seek(0)
    
        # 上传
        filename = get_unique_str() + "." + f.name.split(".")[-1]
        bucket.put_object(filename, buf.getvalue())return HttpResponse('ok')

     前端页面写法:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="/app/upload_to_oss/" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="text" name="name" placeholder="书名"><br>
        <input type="file" name="icon"><br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    

      图片最终会被上传到阿里云OSS管理控制台中你选择的bucket的文件管理中。

    Fake it,till you make it
  • 相关阅读:
    HTML技巧篇:如何让单行文本以及多行文本溢出时显示省略号(…)
    SpringMVC中响应json数据(异步传送)
    如何用Spring框架的<form:form>标签实现REST风格的增删改查操作
    如何使用REST请求风格
    Spring插件的安装与卸载---笔记
    元素 "context:component-scan" 的前缀 "context" 未绑定的解决方案
    简单的文件上传的下载(动态web项目)
    用简单的反射优化代码(动态web项目)
    json数据与Gson工具类的使用
    JSON简介
  • 原文地址:https://www.cnblogs.com/wusir66/p/9872599.html
Copyright © 2020-2023  润新知