【问题标题】:In Django, how do I get a file path for an uploaded file when uploading?在Django中,上传时如何获取上传文件的文件路径?
【发布时间】:2017-02-20 18:52:49
【问题描述】:

我正在尝试为用户上传的文件添加一些验证。这需要通过我制作的名为“sumpin”的自定义脚本运行,该脚本仅将文件路径作为变量并发送回将验证的 JSON 数据。我的脚本中的所有内容都是独立工作的,将它们放在发生错误的地方。

由于这是文件验证,我决定扩展我已经在工作的 file_extension 验证器。

models.py

from allauthdemo.fileuploadapp.slic3rcheck import sumpin

def user_directory_path_files(instance, filename):
    return os.path.join('uploads', str(instance.objectid), filename)


def validate_file_extension(value):
    ext = os.path.splitext(value.name)[1]
    valid_extensions = ['.stl','.STL']
    if not ext in valid_extensions:
        raise ValidationError(u'Please upload a .stl file type only')

    data = sumpin(value.path)

    print (data)


class subfiles(models.Model):
    STL = models.FileField(_('STL Upload'), 
    upload_to=user_directory_path_files, validators=[validate_file_extension])

我得到的错误是路径(value.path)无效。

这是不正确的路径,因为 upload_to 标记必须在以后更改它。这可能很明显,但是当我的脚本被调用时,我还需要将文件放在文件路径位置。所以基本上我的问题是......

  1. 如何将“upload_to”路径传递到我的验证器以运行我的自定义脚本?
  2. 有没有更好的方法来处理上传的文件,比如在主类中使用“保存”或“清理”功能?

【问题讨论】:

    标签: python django validation


    【解决方案1】:

    我找到了自己的答案,但我会在此处发布,以防将来有人遇到此问题。

    我错了,验证器实际上不会下载文件。我需要使用文件上传处理程序,如下所示。

    import os
    from django.core.files.storage import default_storage
    from allauthdemo.fileuploadapp.slic3rcheck import sumpin
    
    
    
    def handle_uploaded_file(f):
        with open(default_storage.path('tmp/'+f.name), 'wb+') as destination:
            for chunk in f.chunks():
                destination.write(chunk)
    
        data = sumpin(default_storage.path('tmp/'+f.name))
        os.remove(default_storage.path('tmp/'+f.name))
        return data
    

    然后我在views.py中调用它。

    from allauthdemo.fileuploadapp.uploadhandler import handle_uploaded_file
    
    @login_required
    def STLupload(request):
        # Handle file upload
        if request.method == 'POST':
            formA = ObjectUp(request.POST, request.FILES)
            if formA is_valid():
                data = handle_uploaded_file(request.FILES['STL'])
    

    这将返回我在 handle_upload_file 中调用的任何内容,这非常适合我的问题。希望将来有人会发现这很有用。

    【讨论】:

    猜你喜欢
    • 2022-12-07
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多