django 上传文件问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django 上传文件问题相关的知识,希望对你有一定的参考价值。

def _upload(file):
'''文件上传函数'''
if file:
path=os.path.join(settings.MEDIA_ROOT,'upload')
file_name=file.name
path_file=os.path.join(path,file_name)
file_upload = open( path_file, 'ab+')
for chunk in file.chunks():
file_upload.write(chunk)
file_upload.close()
fpath='D:/texthub/texthub/site_media/upload/'+file_name.encode('utf-8')
fp=open(fpath,'rb')
essay=Essay()
essay.title=str(file_name)
essay.content= fp.read().decode('gbk').encode('utf-8')
essay.eType=EssayType.objects.get(id=6)
essay.pub_date=datetime.datetime.now()
essay.save()
fp.close()
return True
return False
这样的代码 我上传英文文件可以 上传中文 就不行了 file_name是unicode类型的编码
fpath='D:/texthub/texthub/site_media/upload/'+file_name.encode('utf-8') 执行这条语句的时候 英文文件可以 中文就不行了 ,中文文件打不开应该是中文的处理编码方面出问题

这个问题不是文件上传的问题,是很简单的文件编码。


这个在python里有些费解。经常出错。你要明白,django缺省使用unicode。如果你使用str类型。它会自动给你转换。这是python自动转换。不过在windows下,缺省它用GBK, 有时候会出错。


你这个环境正好是windows。 英文进行encode('utf-8')没有问题。


我建议你在文件前面加上一个coding:utf-8


然后将这句改成

assert(type(file_name)==unicode)
fpath=u'D:/texthub/texthub/site_media/upload/'+file_name.encode('gb18030')


你自己试验一下。

参考技术A 1、贴错误提示,追问

我使用uploadify组件,这个函数里面不会返回debug页面

追答

看后台的错误输出。
同时把'D:/texthub/texthub/site_media/upload/'这个前面加上u

使用 Django 编写文件上传 API

【中文标题】使用 Django 编写文件上传 API【英文标题】:Writing a file upload API using Django 【发布时间】:2011-09-12 01:51:26 【问题描述】:

我有一个围绕用户上传文件的 Django 应用程序,我正在尝试制作一个 API。基本上,这个想法是可以将 POST 请求(例如使用 curl)与文件一起发送到我的应用程序,该应用程序将接受数据并处理它。

我如何告诉 Django 以这种方式收听和接受文件? Django 的所有文件上传文档都围绕着处理从 Django 中的表单上传的文件,所以我不确定如何以其他方式发布文件。

如果我能提供更多信息,我会很乐意。任何能让我入门的东西都将不胜感激。

【问题讨论】:

表单接受一个 POST 请求,并且会做你想做的事。 【参考方案1】:

创建一个只接受 POST 的小视图,并确保它没有CSRF 保护: forms.py

from django import forms

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file  = forms.FileField()

views.py

from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST
from django.http import HttpResponse, HttpResponseServerError

# Imaginary function to handle an uploaded file.
from somewhere import handle_uploaded_file

@csrf_exempt
@require_POST
def upload_file(request):            
    form = UploadFileForm(request.POST, request.FILES)
    if not form.is_valid():
        return HttpResponseServerError("Invalid call")
        
    handle_uploaded_file(request.FILES['file'])
    return HttpResponse('OK')

另见:Adding REST to Django

【讨论】:

如果“@csrf_exempt”可以去掉,会更安全。 :) @ybdesire csrf 是为表单设计的。 API 调用应考虑使用不同的身份验证方法。

以上是关于django 上传文件问题的主要内容,如果未能解决你的问题,请参考以下文章

Django 文件上传大小限制

django/文件上传权限

Django:下载上传的文件

如何在 Django 中更改上传文件的文件名?

django文件上传的时候怎么能加一个上传进度的显示

Django保存上传的文件