我想将上传的文件读成字符串。如果文件大小超过100k,则不允许该文件。
我有以下代码,但是当我使用pdb单步执行它时,data = file.read()行执行后数据为空。
def import_data(request):
params = {}
if request.method == 'POST':
pdb.set_trace()
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
file = request.FILES['file']
data = file.read()
update_database(data)
else:
form = UploadFileForm()
params['form'] = form
return render_to_response('import_data.html',
params,
context_instance=RequestContext(request))
这是我的模板:
% extends 'base.html' %}
{% block content %}
<form enctype="multipart/form-data" action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
{% endblock %}
任何想法如何解决这个问题?
答案 0 :(得分:8)
您是否查看过“Chunking”上传内容。这基本上做的是将上传保存到多个“块”,因为它将其保存到磁盘。我认为这可以帮助您上传更大的文件。
关于“data = file.read()”执行后的空文件,我认为您可以执行类似file.seek(0)的操作,将文件指针返回到文件的开头。我猜测文件的第一次读取是将文件指针留在文件的末尾,所以它看起来是空的。
希望这有帮助, 乔
答案 1 :(得分:2)
此问题的最常见原因是未将属性enctype="multipart/form-data"
添加到HTML中的表单标记中:
<form method="post" enctype="multipart/form-data">
</form>
答案 2 :(得分:0)
即使在使用后
<form method="post" enctype="multipart/form-data"></form>
这对我有用:
from django.core.files.storage import default_storage
my_file=request.FILES['attachment_1']
BASE_DIR =
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
media_path = os.path.join(BASE_DIR,'media')
full_path=os.path.join(media_path,my_file.name)
#print(full_path)
f = default_storage.open(full_path, 'r')
data = f.read()
f.close()
print(data)