Django 上传和保存文档的问题

1 投票
1 回答
1140 浏览
提问于 2025-04-15 13:35

我正在开发一个django应用程序,其中有一部分需要上传文件(比如电子表格或者其他文件)。我遇到了这个错误:

IOError at /fileupload/

[Errno 13] Permission denied: 'fyi.xml'

这里的'fileupload'是我的django应用名称,而'fyi.xml'是我正在上传的测试文档。

为了让apache能够写入,我使用了chmod和chown命令,把[项目目录]/static/documents/文件夹的权限设置为可写。其实我甚至尝试把权限设置为chmod 777,但还是没有成功。

接着,我在settings.py文件中修改了我的MEDIA_ROOT的位置:

MEDIA_ROOT = '/var/www/static/'

然后,为了防止是SELinux的问题,我在/var/www/static下创建了新的documents目录...

drwxr-xr-x 2 apache root 4096 Aug 13 11:20 documents

然后我执行了一些命令,试图更改上下文,以便apache可以在这里写入。我对这个发行版不太熟悉,这是我们使用的Red Hat版本,所以我以前从来没有需要超出chmod和/或chown来解决权限问题。

sudo chcon -h system_u:object_r:httpd_sys_content_t /var/www/static
sudo chcon -R -h root:object_r:httpd_sys_content_t /var/www/static
sudo chcon -R -h root:object_r:httpd_sys_content_t /var/www/static/*

这些尝试都没有任何效果。老实说,我不太确定这里是否真的有SELinux,但因为正常的unix权限似乎不管用,所以我想试试。

那么,有人知道接下来该看什么吗?我不确定应该在这里贴多少代码,但如果有帮助的话,这里是我views.py中的内容:

views.py
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from forms import UploadFileForm
from fyi.models import Materials

def handle_uploaded_file(f):
    destination = open('fyi.xml', 'wb+')
    for chunk in f.chunks():
        destination.write(chunk)
    destination.close()


def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['document'])
            form.save()
            template = 'upload_success.html'
    else:
        form = UploadFileForm()
        template = 'fileupload.html'
    return render_to_response( template, {'form': form})

...任何帮助都将不胜感激。

1 个回答

0

也许可以试着把:

destination = open('fyi.xml', 'wb+')

改成类似这样的:

upload_dir = settings.MEDIA_ROOT # or wherever
destination = open(os.path.join(upload_dir, 'fyi.xml'), 'wb+')

如果是SELinux的问题,也许这个页面会对你有帮助:

撰写回答