首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >限制用户可以上载的文件数量

限制用户可以上载的文件数量
EN

Stack Overflow用户
提问于 2020-07-11 05:10:38
回答 3查看 813关注 0票数 8

我有一个多文件上传,并希望限制用户到3个上传每个。我的问题是,我需要知道user已经在数据库中创建了多少文件,以及它们当前正在上传多少文件(它们可以一次上传多个文件,并且可以多次上传)。

我尝试了很多方法,包括:

创建一个validator (验证器收到的是实际添加的文件,而不是model,所以我无法访问model来获取调用if StudentUploadedFile.objects.filter(student_lesson_data=data.id).count() >= 4:id )。

clean(self):中做验证(clean一次只通过一个实例,直到清理完所有文件后数据库才会更新,所以我可以计算数据库中已经存在的文件,但不能计算当前上传了多少文件)。

使用pre-save方法(如果DB是在传递给我的pre-save方法的每个文件之间更新的,那么它是有效的,但是只有在所有上传的文件都通过了我的pre-save方法之后,DB才会更新)。

我的post-save尝试:

代码语言:javascript
运行
AI代码解释
复制
@receiver(pre_save, sender=StudentUploadedFile)
def upload_file_pre_save(sender, instance, **kwargs):

    if StudentUploadedFile.objects.filter(student_lesson_data=instance.data.id).count() >= 4:
        raise ValidationError('Sorry, you cannot upload more than three files')

编辑:

models.py

代码语言:javascript
运行
AI代码解释
复制
class StudentUploadedFile(models.Model):
    student_lesson_data = models.ForeignKey(StudentLessonData, related_name='student_uploaded_file', on_delete=models.CASCADE)
    student_file = models.FileField(upload_to='module_student_files/', default=None)

views.py

代码语言:javascript
运行
AI代码解释
复制
class StudentUploadView(View):
    def get(self, request):
        files_list = StudentUploadedFile.objects.all()
        return render(self.request, 'users/modules.html', {'student_files': files_list})

    def post(self, request, *args, **kwargs):
        form = StudentUploadedFileForm(self.request.POST, self.request.FILES)
        form.instance.student_lesson_data_id = self.request.POST['student_lesson_data_id']

        if form.is_valid():
            uploaded_file = form.save()

            # pass uploaded_file data and username so new file can be added to students file list using ajax
            # lesson_id is used to output newly added file to corresponding newly_added_files div
            data = {'is_valid': True, 'username': request.user.username, 'file_id': uploaded_file.id, 'file_name': uploaded_file.filename(),
            'lesson_id': uploaded_file.student_lesson_data_id, 'file_path': str(uploaded_file.student_file)}
        else:
            data = {'is_valid': False}
        return JsonResponse(data)

template.py

代码语言:javascript
运行
AI代码解释
复制
<form id='student_uploaded_file{{ item.instance.id }}'>
                                                {% csrf_token %}
                                                <a href="{% url 'download_student_uploaded_file' username=request.user.username file_path=item.instance.student_file %}" target='_blank'>{{ item.instance.filename }}</a>
                                                <a href="{% url 'delete_student_uploaded_file' username=request.user.username file_id=item.instance.id %}" class='delete' id='{{ item.instance.id }}'>Delete</a>
                                            </form>

js

代码语言:javascript
运行
AI代码解释
复制
$(function () {
    // open file explorer window
    $(".js-upload-photos").on('click', function(){
        // concatenates the id from the button pressed onto the end of fileupload class to call correct input element
        $("#fileupload" + this.id).click();
     });

    $('.fileupload_input').each(function() {
        $(this).fileupload({
            dataType: 'json',
            done: function(e, data) { // process response from server
            // add newly added files to students uploaded files list
            if (data.result.is_valid) {
                $("#newly_added_files" + data.result.lesson_id).prepend("<form id='student_uploaded_file" + data.result.file_id +
                "'><a href='/student_hub/" + data.result.username + "/download_student_uploaded_file/" +
                data.result.file_path + "' target='_blank'>" + data.result.file_name + "</a><a href='/student_hub/" + data.result.username +
                "/delete_student_uploaded_file/" + data.result.file_id + "/'  class='delete' id=" + data.result.file_id + ">Delete</a></form>")
            }
            }
        });
    });

更新: forms.py

代码语言:javascript
运行
AI代码解释
复制
class StudentUploadedFileForm(forms.ModelForm):
    student_file = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

view.py

代码语言:javascript
运行
AI代码解释
复制
class StudentUploadView(View):
    model = StudentUploadedFile
    max_files_per_lesson = 3

    def post(self, request, *args, **kwargs):
        lesson_data_id = request.POST['student_lesson_data_id']
        current_files_count = self.model.objects.filter(
            student_lesson_data_id=lesson_data_id
        ).count()
        avail = self.max_files_per_lesson - current_files_count
        file_list = request.FILES.getlist('student_file')
        print(len(file_list))
        if avail - len(file_list) < 0:
            return JsonResponse(data={
                'is_valid': False,
                'reason': f'Too many files: you can only upload {avail}.'
            })
        else:
            for f in file_list:
                print(f)
                
        data = {'test': True}
        return JsonResponse(data)

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2020-07-17 18:58:35

我尝试过使用PyPi包,它可以完美地工作。我将在这里冒险,并假设您愿意编辑包代码来修复由于兼容性问题而遇到的任何错误,因为大多数很长时间没有更新的包可能会遇到这些错误。

为了解决限制用户上传文件数量的问题,django-multiuploader包将会有很大的帮助,而且诚实地说,它会做比你要求的更多的事情。是的,它使用JQuery表单来上传多个文件。

怎么用?

安装和使用前步骤

安装

代码语言:javascript
运行
AI代码解释
复制
pip install django-multiuploader
python3 manage.py syncdb
python3 manage.py migrate multiuploader

settings.py文件中:

代码语言:javascript
运行
AI代码解释
复制
MULTIUPLOADER_FILES_FOLDER = ‘multiuploader’ # - media location where to store files

MULTIUPLOADER_FILE_EXPIRATION_TIME = 3600  # - time, when the file is expired (and it can be cleaned with clean_files command).

MULTIUPLOADER_FORMS_SETTINGS =

{
'default': {
    'FILE_TYPES' : ["txt","zip","jpg","jpeg","flv","png"],
    'CONTENT_TYPES' : [
            'image/jpeg',
            'image/png',
            'application/msword',
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'application/vnd.ms-excel',
            'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'application/vnd.ms-powerpoint',
            'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'application/vnd.oasis.opendocument.text',
            'application/vnd.oasis.opendocument.spreadsheet',
            'application/vnd.oasis.opendocument.presentation',
            'text/plain',
            'text/rtf',
                ],
    'MAX_FILE_SIZE': 10485760,
    'MAX_FILE_NUMBER':5,
    'AUTO_UPLOAD': True,
},
'images':{
    'FILE_TYPES' : ['jpg', 'jpeg', 'png', 'gif', 'svg', 'bmp', 'tiff', 'ico' ],
    'CONTENT_TYPES' : [
        'image/gif',
        'image/jpeg',
        'image/pjpeg',
        'image/png',
        'image/svg+xml',
        'image/tiff',
        'image/vnd.microsoft.icon',
        'image/vnd.wap.wbmp',
        ],
    'MAX_FILE_SIZE': 10485760,
    'MAX_FILE_NUMBER':5,
    'AUTO_UPLOAD': True,
},
'video':{
    'FILE_TYPES' : ['flv', 'mpg', 'mpeg', 'mp4' ,'avi', 'mkv', 'ogg', 'wmv', 'mov', 'webm' ],
    'CONTENT_TYPES' : [
        'video/mpeg',
        'video/mp4',
        'video/ogg',
        'video/quicktime',
        'video/webm',
        'video/x-ms-wmv',
        'video/x-flv',
        ],
    'MAX_FILE_SIZE': 10485760,
    'MAX_FILE_NUMBER':5,
    'AUTO_UPLOAD': True,
},
'audio':{
    'FILE_TYPES' : ['mp3', 'mp4', 'ogg', 'wma', 'wax', 'wav', 'webm' ],
    'CONTENT_TYPES' : [
        'audio/basic',
        'audio/L24',
        'audio/mp4',
        'audio/mpeg',
        'audio/ogg',
        'audio/vorbis',
        'audio/x-ms-wma',
        'audio/x-ms-wax',
        'audio/vnd.rn-realaudio',
        'audio/vnd.wave',
        'audio/webm'
        ],
    'MAX_FILE_SIZE': 10485760,
    'MAX_FILE_NUMBER':5,
    'AUTO_UPLOAD': True,
}}

注意那个MAX_FILE_NUMBER,他们就是你问题的答案。安装后请查看源代码,如果需要,可以尝试自己实现它。这可能会很有趣。

有关更多说明,请参阅:django-multiuploader package on pypi

票数 1
EN

Stack Overflow用户

发布于 2020-07-19 07:51:41

我猜你可以在Django中使用multi file upload还没有普及到社区。摘录:

如果您想使用一个表单字段上传多个文件,请设置字段的控件的multiple属性:

代码语言:javascript
运行
AI代码解释
复制
# forms.py

from django import forms

class FileFieldForm(forms.Form):
    file_field = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

您的表单和视图结构也是精心设计的,从表单中排除字段,然后通过HTML表单在模型实例上设置注入的值。但是,使用显示的代码,模型实例将永远不会存在,因为表单没有主键字段。不管怎样--专注于需要解决的问题...

在表单中,request.FILES现在是一个数组:

代码语言:javascript
运行
AI代码解释
复制
class StudentUploadView(View):
    model = StudentUploadedFile
    max_files_per_lesson = 3
    def post(request, *args, **kwargs):
        lesson_data_id = request.POST['student_lesson_data_id']
        current_files_count = self.model.objects.filter(
            student_lesson_data_id=lesson_data_id
        ).count()
        avail = self.max_files_per_lesson - current_files_count
        file_list = request.FILES.get_list('student_file')
        if avail - len(file_list) < 0:
            return JsonResponse(data={
                'is_valid': False,
                'reason': f'Too many files: you can only upload {avail}.'
            })
        else:
            # create one new instance of self.model for each file
            ...

处理评论:从美学的角度来看,你可以做很多with styling...

然而,上传异步(单独的POST请求),使验证和用户体验变得非常复杂:

  • 第一个文件可以在第二个之后完成,那么如果计数大于3,您将拒绝哪一个。
  • 前端验证是可破解的,因此您不能依赖它,但后端验证被划分为多个请求,从用户的角度来看,这是一个操作。
  • 但由于文件到达顺序混乱,一些成功,一些失败,您如何向用户提供反馈?
  • 如果1,3和4到达,但用户更关心1,2,3-用户必须采取多项措施来纠正这种情况。

一个post请求:

  • 没有乱序到达您可以使用“一切失败或一切成功”的方法,这种方法对最终用户是透明的,并且很容易correct.
  • It's文件数组顺序可能是用户首选的顺序,因此即使您允许部分成功,您也可能会做正确的事情。
票数 1
EN

Stack Overflow用户

发布于 2020-07-14 04:46:17

所以它的要点是您正在使用jQuery .each通过AJAX上传图像。对Django视图的每个POST请求都是一个文件上传,但可能同时有多个请求。

试试这个:

forms.py:

代码语言:javascript
运行
AI代码解释
复制
class StudentUploadedFileForm(forms.ModelForm):

    class Meta:
        model = StudentUploadedFile
        fields = ('student_file', )

    def __init__(self, *args, **kwargs):
        """Accept a 'student_lesson_data' parameter."""
        self._student_lesson_data = kwargs.pop('student_lesson_data', None)
        super(StudentUploadedFileForm, self).__init__(*args, **kwargs)

    def clean(self):
        """
        Ensure that the total number of student_uploaded_file instances that
        are linked to the student_lesson_data parameter are within limits."""
        cleaned_data = super().clean()
        filecount = self._student_lesson_data.student_uploaded_file.count()
        if filecount >= 3:
            raise forms.ValidationError("Sorry, you cannot upload more than three files")
        return cleaned_data

views.py:

代码语言:javascript
运行
AI代码解释
复制
class StudentUploadView(View):
    def get(self, request):
        # stuff ...

    def post(self, request, *args, **kwargs):
        sld_id = request.POST.get('student_lesson_data_id', None)
        student_lesson_data = StudentLessonData.objects.get(id=sld_id)
        form = StudentUploadedFileForm(
            request.POST,
            request.FILES,
            student_lesson_data=student_lesson_data
        )

        if form.is_valid():
            uploaded_file = form.save()
            # other stuff ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62845434

复制
相关文章
linux中修改打开文件的数量限制
在 Linux中你可以更改打开文件的最大数量。你可以使用ulimit命令。它使你能够控制可用于 shell 或由它启动的进程的资源。 查找 Linux 打开文件限制 # cat /proc/sys/fs/file-max 365004 该值表示每次登录会话可以打开的文件数。不同系统结果可能会有所不同。 例如在一个 CentOS 我的服务器,限制设置为 365004 在 Linux 中检查硬限制 # ulimit -Hn 65535 检查 Linux 中的软限制 # ulimit -Sn 65535
入门笔记
2022/06/02
3.5K0
Android:支持单选,多选,还可以限制选择的数量的流式布局
由于开发需要,需要做一个效果,一个流式布局的标签,可多选,并且要限制选择的数量,在查找了许多大神写的代码后,决定用鸿洋大神写的一个框架.
程思扬
2022/01/10
9580
Linux系统打开文件最大数量限制
-H选项和-S选项分别表示对给定资源的硬限制(hard limit)和软限制(soft limit)进行设置。
用户1685462
2021/07/25
3.4K0
WordPress 技巧:限制分类数量
如果你和我一样,使用 WordPress MU 做一个平台,比如我做的花生小店,需要限制每个博客的商品分类的数量:
Denis
2023/04/14
6390
WordPress 技巧:限制分类数量
WordPress 技巧:限制文章数量
如果你和我一样,使用 WordPress MU 做一个平台,比如我做的花生小店,需要限制每个博客的商品数量:
Denis
2023/04/14
6780
WordPress 技巧:限制文章数量
WordPress 技巧:限制素材数量
WordPress 后台限制系列最后一篇,限制图片素材的数量,废话不多说,直接上代码:
Denis
2023/04/14
9090
WordPress 技巧:限制素材数量
go语言限制Goroutine数量
package main import ( _ "ORMTest/routers" "fmt" "runtime" "time" ) func main() { runtime.GOMAXPROCS(runtime.NumCPU()) c := make(chan bool, 100) t := time.Tick(time.Second) go func() { for { select { case <-t: watching() } }
IT工作者
2021/12/24
7420
在Linux系统下限制指定目录的大小以及文件/文件夹数量
在Linux操作系统下有时需要限制一个指定文件夹的大小和文件夹内可存储的文件数量,有可能是出于安全的考量或者定制化的配置,这里我们提供了一种方案:用dd创建一个空的img镜像,进行格式化的配置,然后将其绑定到指定的文件夹上可以限制该文件夹的一些属性。
DechinPhy
2021/05/21
3.7K0
在Linux系统下限制指定目录的大小以及文件/文件夹数量
在Linux操作系统下有时需要限制一个指定文件夹的大小和文件夹内可存储的文件数量,有可能是出于安全的考量或者定制化的配置,这里我们提供了一种方案:用dd创建一个空的img镜像,进行格式化的配置,然后将其绑定到指定的文件夹上可以限制该文件夹的一些属性。
呆呆
2021/05/25
7.8K1
解除飞young宽带设备数量的限制
首先感谢cj大佬 的开源,吃水不忘挖井人 很多学校都有校园网需要拿账号去登陆或者限制流量或者限制时间才能畅游internet这就很烦,俗话说上有政策下有对策,大家也想了很多的办法来解决这些限制。诸如:绕端口,扫账号,克隆mac利用路由器固件等等! 今天我就要给大家介绍一个针对破解飞young设备限制方法极其简单,这样一个宿舍都可以用了。可以平摊网费剩下一笔巨款。废话不多说我们进入正题。
用户7146828
2021/08/09
6K0
Discourse 如何限制存储到 S3 的备份文件数量
根据当前你 Discourse 的大小,如果你已经将图片分开存储的话,你可以备份更多的内容。
HoneyMoose
2020/06/01
1.2K0
Discourse 如何限制存储到 S3 的备份文件数量
Python 限制线程的最大数量(Sem
import threading import time sem=threading.Semaphore(4) #限制线程的最大数量为4个 def gothread(): with sem: #锁定线程的最大数量 for i in range(8): print(threading.current_thread().name,i) time.sleep(1) for i in range(5): threading.
py3study
2020/01/06
2.4K0
团队如何限制合适的在制品(WIP)数量
看板之父David Anderson曾说过“看板的本质是一个很朴素的思想:在制品必须被限制。”但对于团队来说,确定一个合适的在制品限制可能是件棘手的事。
敏捷开发
2022/05/05
2K0
团队如何限制合适的在制品(WIP)数量
单细胞数量太多可以抽样也可以
但是有同学提问,它的单细胞表达量矩阵是五万到十万个细胞,并不想预先拆分成为单细胞亚群分组,所以没办法使用AverageExpression得到一个简单的表达量矩阵,想直接对全部的单细胞矩阵进行gsva,但是矩阵每次都会内存溢出,大家也可以尝试下面的代码:
生信技能树
2022/07/26
2.4K0
单细胞数量太多可以抽样也可以
sftp限制用户目录
vsftp搭建安装详见:Redhat6.8搭建ftp服务器并限制用户目录和访问ip
loong576
2019/09/10
5.1K0
sftp限制用户目录
如何限制 WordPress 站点的文章,分类和素材的数量
如果你和我一样,使用 WordPress 多站点来做一个 SaaS 平台,比如我做的花生小店,那么就需要对限制每个站点的文章类型,分类模式和媒体素材的数量进行限制:
Denis
2023/04/13
4790
如何限制 WordPress 站点的文章,分类和素材的数量
用 subsetting 限制连接池中的连接数量
内网使用服务发现后,服务与其它服务的实例之间使用一条 TCP 长连接进行通信。这种情况下常见的做法是按照 registry 下发的 host:port 列表来直接建连。
梦醒人间
2020/12/02
1.9K0
用 subsetting 限制连接池中的连接数量
mongodb配置文件详解,内存限制,用户验证 yaml格式
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
拓荒者
2019/09/19
2.6K0
facebook用户数量
做外贸肯定都知道facebook,听说过facebook是全球最大的社交平台,但很多人对于facebook用户数量到底有多少还不是很清楚,今天就让一米软件来告诉大家。
用户3736847
2019/04/25
3.6K0
linux如何限制用户权限
具体开展的方法: 1. 修改代码配置,将log输出到一个单独的目录:/search/odin/flxlog/swc.log 2. 新建一个账户flxlog,默认目录为log目录:useradd -d /search/odin/flxlog/swc.log flxlog 3. 创建flxlog密码为flxlog:passwd flxlog。 4. 修改/search/odin/flxlog/文件夹及文件的用户和用户组:chown -R flxlog:flxlog /search/odin/flxlog/ 5. 修改泛灵犀代码目录的权限为root账号读写、其他账号不能查看: chown -R root:root /search/odin/test/test/ chmod 700 swc_15001/ 6. 切换到flxlog用户下,验证下结果:
软测小生
2019/07/05
9.9K0
linux如何限制用户权限

相似问题

jquery文件上载限制文件数量

56

上载文件的数量限制

11

限制IAM用户可以创建的“用户”数量

229

限制用户可以创建的文档数量

13

限制用户可以上传的文件数量(Laravel 5.3)

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文