Django-文件上传

本文介绍了在Django中如何使用request.FILES进行文件上传,包括表单设置、存储路径配置、文件对象属性和方法的使用。同时,针对文件上传的安全隐患,提出了一种文件上传类`FileUpload`,用于限制上传文件类型并实现文件名随机化,确保文件上传过程的安全性。
摘要由CSDN通过智能技术生成

使⽤request.FILES 获取上传文件

一、表单注意

表单的enctype的值需要设置为:enctype="multipart/form-data“

表单提交类型为POST

二、存储路径

settings.py中需要配置一下文件的存储路径

MDEIA_ROOT = os.path.join(BASE_DIR,'static/upload')

三、文件上传对象的属性和方法

名称说明
file.name获取上传的名称
file.size获取上传文件的大小
file.read()读取全部(适用于小文件)
file.chunks()按块来返回⽂件 通过for循环进⾏迭代,可以将大文件按照块来写⼊到服务器
file.multiple_chunks()判断文件是否大于2.5MB,返回True或者False

四、前端

file.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action={% url 'app:upload' %} method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="file"> <br>
    <input type="submit" value="submit">
</form>
</body>
</html>

五、路由

urlpatterns = [
    path('upload/', views.upload, name='upload')
]

六、视图

def upload(request):
    if request.method == 'POST':
        file = request.FILES.get('file')
        # 保存路径
        savePath = os.path.join(settings.MDEIA_ROOT, file.name)
        # 保存文件
        with open(savePath, 'wb') as f:
            if file.multiple_chunks():
                for myf in file.chunks():
                    f.write(myf)
                print('file > 2.5MB')
            print('file < 2.5MB')
            f.write(file.read())
        return HttpResponse('OK')
    return render(request, 'app/file.html')

此时运行我们的程序我们发现已经可以上传文件了,但是这里存在一下问题,我们这个文件存在一些问题,比如什么文件都可以上传,这样的话存在安全隐患,我们可以封装一个类来实现文件上传功能。

七、封装

fileupload.py

class FileUpload():
    def __init__(self, file, path, exts=['png', 'jpg', 'jpeg', 'caj'], is_random_name=True):
        """
         :param file: ⽂件上传对象
         :param exts: ⽂件类型
         :param is_random_name: 是否是随机⽂件名,默认是否
         """
        self.file = file
        self.exts = exts
        self.is_random_name = is_random_name
        self.path = path

    # 文件上传
    def upload(self):
        if self.check_type() and self.creat_path():
            self.save()

    # 判断文件类型是否匹配
    def check_type(self):
        file_type_name = self.file.name.split('.')[-1]
        if file_type_name not in self.exts:
            raise Exception('文件类型不匹配')
        else:
            return 1

    # 全路径
    def creat_path(self):
        if self.is_random_name:
            self.path = self.path + str(hash(self.file)) + self.file.name.split('.')[-1]
        return 1

    # 保存文件
    def save(self):
        with open(self.path, 'wb') as f:
            # 大于2.5MB分段传输
            if self.file.multiple_chunks():
                for myf in self.file.chunks():
                    # 下雨2.5MB整体传输
                    f.write(myf)
            f.write(self.file.read())

当然我们也可以在其中封装入我们对于文件合法性的判断

我们的视图函数如下

def upload(request):
    if request.method == 'POST':
        file = request.FILES.get('file')
        file_upload = FileUpload(file, settings.MDEIA_ROOT)
        try:
            file_upload.upload()
        except Exception as e:
            print(e)
            return HttpResponse('No')
        return HttpResponse("OK")
    return render(request, 'app/file.html')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LyaJpunov

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值