使用Django将上传的文件读入字符串

时间:2011-05-02 18:11:56

标签: django

我想将上传的文件读成字符串。如果文件大小超过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 %}

任何想法如何解决这个问题?

3 个答案:

答案 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)