Django上传文件错误:[Errno 2]没有这样的文件或目录

时间:2015-03-26 07:01:49

标签: python django

我在网上学习了Django并练习如何上传文件 有错误

[Errno 2] No such file or directory: 

这是我的文件结构(' - '我用''目录')

web08 
    --blog
        --templates
            regist.html
        __init__.py
        admin.py
        models.py
        tests.py
        views.py
    --web08
        --upload
        __init__.py
        settings.py
        urls.py
        wsgi.py
    manage.py

我不知道将upload指引放在哪里 请教我,谢谢!

views.py:

class UserForm(forms.Form):
    username = forms.CharField()
    headImg = forms.FileField()

def regist(req):
    if req.method == 'POST':
        uf = UserForm(req.POST,req.FILES)
        if uf.is_valid():
            fp = file('/upload/'+uf.cleaned_data['headImg'].name,'wb')
            s = uf.cleaned_data['headImg'].read()
            fp.write(s)
            fp.close()
            return HttpResponse('ok')
    else:
        uf = UserForm()
    return render_to_response('regist.html',{'uf':uf})

1 个答案:

答案 0 :(得分:1)

在这一行:

fp = file('/upload/'+uf.cleaned_data['headImg'].name,'wb')

您正在引用似乎不存在的绝对路径/upload/。另外,请使用os.path.join组合路径组件。

此外,这可能是一个主要的安全问题,因为您使用可能未经过滤的用户输入cleaned_data['headImg'].name作为文件名。这可能允许用户覆盖/upload/目录中的任何文件,或者 - 甚至更糟糕的使用相对路径 - 您的django服务器具有写访问权限的任何文件。

上传目录的位置取决于您希望上传的文件对外界可见或只能由服务器访问的问题。

对于前者,您应该使用django的 media 存储引擎。这通常位于由django设置MEDIA_ROOT命名的目录中的文件系统上。媒体存储目录旨在由生产Web服务器直接提供,而无需先通过django。

另请阅读关于Managing Files的django文档。

如果您想要上传文件的自定义目录(例如,因为您不希望它们公开可用),请定义您自己的存储引擎:

from django.core.files.storage import FileSystemStorage
upload_storage = FileSystemStorage(uploads_dir)

并在您的文件字段中使用它:

headImg = forms.ImageField(upload_to=upload_storage)

[...]

headImg = uf.cleaned_data['headImg']
headImg.save() # this will save the image to the storage engine.
               # no need to do this manually

很少需要直接在django中访问文件系统路径。