我正在开发一个项目,其中包含各种应用程序,如协议,预测等。
进行一些计算"协议"和"预测"应用程序需要以文件上载的形式进行用户输入。
我已经实现了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将在下一个用户输入之前删除上传的文件。
答案 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