我是python / django / tastypie的新手,我正在尝试上传文件。我得到一个非常奇怪的(对我而言)错误,我似乎无法弄明白。每当我尝试通过我的其他客户端(CocoaRest客户端)上传照片时,它都会发生以下错误:
{
"error_message" : "Invalid boundary in multipart: None",
"traceback" : "Traceback (most recent call last):\n\n File \"/Users/crown/Documents/Sources/Virtualenvs/GOCApi/lib/python2.7/site-packages/tastypie/resources.py\", line 195, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"/Users/crown/Documents/Sources/GOCApi/api/resources/member.py\", line 85, in post_profile_picture\n if('image' in request.FILES):\n\n File \"/Users/crown/Documents/Sources/Virtualenvs/GOCApi/lib/python2.7/site-packages/django/core/handlers/wsgi.py\", line 214, in _get_files\n self._load_post_and_files()\n\n File \"/Users/crown/Documents/Sources/Virtualenvs/GOCApi/lib/python2.7/site-packages/django/http/request.py\", line 217, in _load_post_and_files\n self._post, self._files = self.parse_file_upload(self.META, data)\n\n File \"/Users/crown/Documents/Sources/Virtualenvs/GOCApi/lib/python2.7/site-packages/django/http/request.py\", line 176, in parse_file_upload\n parser = MultiPartParser(META, post_data, self.upload_handlers, self.encoding)\n\n File \"/Users/crown/Documents/Sources/Virtualenvs/GOCApi/lib/python2.7/site-packages/django/http/multipartparser.py\", line 69, in __init__\n raise MultiPartParserError('Invalid boundary in multipart: %s' % boundary)\n\nMultiPartParserError: Invalid boundary in multipart: None\n"
}
我的标题设置为“Content-Type:multipart / form-data”,并且文件标签中添加了一个文件。
这是我从客户端调用的方法:
def post_profile_picture(self, request, *args, **kwargs):
if(request.method == 'POST'):
if(str(request.META['CONTENT_TYPE']) != "multipart/form-data"):
return self.create_response(request, HelperMethods.api_return_msg("Unsupported media type"), response_class=http.HttpBadRequest)
else:
if('image' in request.FILES):
#bunch of code removed
return self.create_response(request, {"profile_img" : profile_img_key_name, "thumb_img" : thumb_img_key_name}, response_class=http.HttpResponse)
else:
return self.create_response(request, HelperMethods.api_return_msg("No image found"), response_class=http.HttpBadRequest)
else:
return self.create_response(request, HelperMethods.api_return_msg("Method not allowed"), response_class=http.HttpMethodNotAllowed)
当我在if之前执行打印(请求)时(request.FILES中的'image'),我没有得到同样的错误,它实际上跳转到我的其他并打印“找不到图像”,这很奇怪不会以同样的方式爆炸。
我不确定我还需要做什么,添加更多标题?设置一个“边界”(不确定那是什么)...非常感谢任何帮助。我愿意尝试并在此发布结果以获得更好的帮助。谢谢!
答案 0 :(得分:4)
结束制作新的ModelResource,然后将Content-Type设置为:multipart / form-data;边界=前沿
我花了一段时间来弄清楚这一点,即使OP是昨天,10小时是大量的谷歌搜索和反复试验...... smdh。
以下是模型资源:
from tastypie import http, fields
from django.conf.urls import url
from tastypie.resources import ModelResource
from api.helper_methods import HelperMethods
from django.conf import settings
from boto.s3.connection import S3Connection
from boto.s3.key import Key
import cStringIO
from PIL import Image, ImageOps
class FileUploadResource(ModelResource):
img = fields.FileField(attribute="img", null=True, blank=True)
class Meta:
allowed_methods = 'post'
resource_name = 'file_upload'
include_resource_uri = False
def prepend_urls(self):
return [
url(r"^(?P<resource_name>%s)/$" % self._meta.resource_name, self.wrap_view('get_profile_picture'), name="api_get_profile_picture"),
url(r"^(?P<resource_name>%s)/profile_picture/$" % self._meta.resource_name, self.wrap_view('post_profile_picture'), name="api_post_profile_picture"),
]
def get_profile_picture(self, request, **kwargs):
return self.create_response(request, HelperMethods.api_return_msg("Bad requested"), response_class=http.HttpBadRequest)
def post_profile_picture(self, request, **kwargs):
if(request.method == 'POST'):
if "multipart/form-data" not in str(request.META['CONTENT_TYPE']):
return self.create_response(request, HelperMethods.api_return_msg("Unsupported media type"), response_class=http.HttpBadRequest)
else:
if('image' in request.FILES):
upload = request.FILES['image']
main_img = Image.open(upload)
profile_img = main_img.resize((200,200), Image.ANTIALIAS)
profile_img_io = cStringIO.StringIO()
profile_img.save(profile_img_io, 'PNG', quality=85)
thumb_img = main_img.resize((80,80), Image.ANTIALIAS)
thumb_img_io = cStringIO.StringIO()
thumb_img.save(thumb_img_io, 'PNG', quality=85)
conn = S3Connection(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
bucket = conn.get_bucket(settings.BUCKET_NAME)
profile_img_key_name = HelperMethods.generate_pic_key() + ".png"
profile_img_key = Key(bucket)
profile_img_key.key = profile_img_key_name
profile_img_key.set_contents_from_string(profile_img_io.getvalue())
profile_img_key.make_public()
thumb_img_key_name = HelperMethods.generate_pic_key() + ".png"
thumb_img_key = Key(bucket)
thumb_img_key.key = thumb_img_key_name
thumb_img_key.set_contents_from_string(thumb_img_io.getvalue())
thumb_img_key.make_public()
return self.create_response(request, {"profile_img" : profile_img_key_name, "thumb_img" : thumb_img_key_name}, response_class=http.HttpResponse)
else:
return self.create_response(request, HelperMethods.api_return_msg("No image found"), response_class=http.HttpBadRequest)
else:
return self.create_response(request, HelperMethods.api_return_msg("Method not allowed"), response_class=http.HttpMethodNotAllowed)
在使用PIL更改图像后,它还使用amazon s3存储图像。