我正在尝试为用户上传的文件添加一些验证。这需要运行我称为“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标记必须在以后更改此值。这可能是显而易见的,但我还需要在调用脚本时将文件放在文件路径位置。基本上我的问题是......
答案 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中返回的任何内容,这对我的问题非常有用。希望有人会发现这对未来有用。