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')
你自己试验一下。
我使用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 上传文件问题的主要内容,如果未能解决你的问题,请参考以下文章