在Django中,如何在上传时获取上传文件的文件路径?

时间:2016-10-12 04:42:52

标签: python django validation

我正在尝试为用户上传的文件添加一些验证。这需要运行我称为“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. 是否有更好的方法来处理上传的文件,例如在具有“保存”或“清除”功能的主类中?

1 个答案:

答案 0 :(得分:0)

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

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

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中返回的任何内容,这对我的问题非常有用。希望有人会发现这对未来有用。