Django文件上传为项目中的不同应用程序?

时间:2018-02-05 09:12:02

标签: python django django-models django-forms django-templates

我正在开发一个项目,其中包含各种应用程序,如协议,预测等。

进行一些计算"协议"和"预测"应用程序需要以文件上载的形式进行用户输入。

我已经实现了bellow架构,该架构将文件成功上传到" media"目录,它存在于基础项目目录中。

我想以这种方式实现文件上传,以便它可以上传相应app目录的文件而不是公共媒体目录。

我的代码是这样的:

Views.py

def simple_upload(request):

    if request.method == 'POST' and request.FILES['myfile']:
        myfile = request.FILES['myfile']
        fs = FileSystemStorage()
        filename = fs.save(myfile.name, myfile)
        uploaded_file_url = fs.url(filename)
        print uploaded_file_url

        return render(request, 'protocol/submit_job.html', {})

    return render(request, 'protocol/main_protocol.html')

urls.py

url(r'^protocol/$', views.simple_upload, name='simple_upload'),

HTML

<form method="post" enctype="multipart/form-data">
 <div class="heading">
 <h1> Machine Learning Modeling.. </h1>
 <h2> Upload CSV files .. </h2>
 </div>
    {% csrf_token %}
    <input class="input" type="file" name="myfile">
    <button class="button" type="submit"> Upload file  and submit job </button>
  </form>

  {% if uploaded_file_url %}
    <p class="text" >File uploaded successfully. </p>
  {% endif %}

此架构适用于我并将所有文件上传到媒体目录.. 我应该以特定于应用程序的方式上传文件。

例如:

prediction/Input/uploaded_file_1.csv
protocol/Input/uploaded_file_2.csv

我不想将任何文件保存或上传到模型或数据库中。 Appl将在下一个用户输入之前删除上传的文件。

2 个答案:

答案 0 :(得分:1)

如果您有一个FileField用于引用模型中的文件,那么您可以使用upload_to属性执行此操作。它可能类似于以下代码:

from os import path

def _upload_path(instance, filename):
    return path.join(instance._meta.app_label, 'Input', filename)

class MyModel(models.Model):
    ...
    file = models.FileField(upload_to=_upload_path)

我没有测试过上面的代码。如果您能够使用该代码,请返回反馈。

如果您没有使用模型选择上传目录,请使用视图中的代码来执行此操作。以下代码用于上传单个文件:

def handle_uploaded_file(f):
    with open('some/file/name.txt', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

您可以根据需要编辑上传路径。例如,我在我的视图中使用了上面的代码来上传多个文件而不使用我的项目中的模型。

def Upload(request):
    for count, x in enumerate(request.FILES.getlist("files")):
        def process(f):
            with open('/Users/Michel/django_1.8/projects/upload/media/file_' + str(count), 'wb+') as destination:
                for chunk in f.chunks():
                    destination.write(chunk)
        process(x)
    return HttpResponse("File(s) uploaded!")

答案 1 :(得分:1)

FileSystemStorage类具有location参数,默认设置为MEDIA_ROOT,但您可以将其更改为任何其他目录。

首先,更改班级的默认位置:

fs = FileSystemStorage(location='prediction/Input/')

然后以与现在相同的方式保存文件。不要忘记写权限。

以下是该课程的文档: https://docs.djangoproject.com/en/2.0/ref/files/storage/#the-filesystemstorage-class