首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ASIHTTPRequest将文件上传到django-piston

用ASIHTTPRequest将文件上传到django-piston
EN

Stack Overflow用户
提问于 2011-02-20 02:18:32
回答 2查看 1.2K关注 0票数 2

我正在尝试使用ASIHTTPRequest将一些JSON和一个二进制文件从iPhone发布到运行django-piston的Django服务器上

如果我只发送JSON字符串,我知道如何让它工作,如果我只发送文件,我知道如何让它工作,但两者都很棘手。

因此我们将从ASIHTTPRequest代码开始

代码语言:javascript
复制
ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url];

[request setRequestMethod:@"POST"];

[request setPostFormat:ASIMultipartFormDataPostFormat];

[request appendPostData:[@"{\"save\":{\"name\":\"iostest\"}}" dataUsingEncoding:NSUTF8StringEncoding]];

[request addData:UIImageJPEGRepresentation([UIImage imageNamed:@"test.jpg"], 1.0f)
    withFileName:@"test.jpg"
  andContentType:@"image/jpeg"
          forKey:@"data"];

[request setDelegate:self];

[request startAsynchronous];

我最好的想法是,将原始字符串数据直接添加到POST正文中,然后再添加一个文件是行不通的。

但如果我转而尝试

代码语言:javascript
复制
[request setPostValue:@"{\"name\":\"iostest\"}" forKey:@"save"];

然后,活塞数据字典将“save”存储为字符串,而不是反序列化对象,因此它将按字面意思传递该字符串

代码语言:javascript
复制
"{\"name\":\"iostest\"}"

这是我的Piston处理程序代码

代码语言:javascript
复制
def create(self, request):

     data = request.data

     print(data['save']) #{\"name\":\"iostest\"}"
     print("Files: " + request.FILES['data'].name) #test.jpg
     print("Data Save Name: " + data['save']['name']) #crash, interprets this as a string indeces lookup

欢迎大家提出想法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-22 12:07:55

我基本上已经用我的方式解决了这个问题。

基本的问题是,Django期望文件提交到服务器的请求格式,实际上是django-piston所使用的格式。

当它遇到多部分请求时,它根本不会尝试解析数据。

这个问题的解决方案是手动调用解析引擎,在JSON的情况下,它直接从django.utils中出来(这有点令人失望)。

您可以通过使用ASIHTTPRequest (或您选择的请求模块)通过键设置标准的POST值,然后以传统的方式访问它来实现这一点。

代码语言:javascript
复制
from django.utils import simplejson
data = simplejson.loads(request.POST['save'])

这基本上只是将这个处理程序方法简化为一个常规的旧Django视图,就您必须执行的步骤而言。

那么很明显,django-piston显然不是用来处理文件的?

票数 1
EN

Stack Overflow用户

发布于 2011-02-21 07:30:51

这里我最好的想法是,将原始字符串数据直接添加到POST正文中,然后添加一个文件是行不通的。

那是行不通的,不。如果你是使用‘POSTing /x-www- form -urlencoded’格式的应用程序表单数据,或者'multipart/ form - data‘,你将不能仅仅在末尾添加一些额外的数据-它需要作为表单数据的一部分。我猜是这样的..。

[request setPostValue:@"{\"save\":{\"name\":\"iostest\"}}" forKey:@"data"];

,但是如果我删除字符串数据,只发布文件,它仍然不能工作。

是更有问题的。

,或者如果是活塞错误地读取了数据。

首先,我可能不会从这个方向考虑--活塞并不会真正干扰request对象,所以看起来更有可能是ASI请求不太正确。

我认为首先要检查传入的请求,并检查它是否真的是有效的表单POST请求:

  1. 检查request["CONTENT_TYPE"]是否设置为'multipart/form-data'
  2. Inspect request.raw_post_data,并确保它是http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2中指定的有效表单数据-检查密钥名称是否如您预期的那样,以及文件内容是否存在。(很明显,在测试这项功能时,您会希望使用一个小的文本文件!)
    1. 检查request.FILES中实际存在的键(如果有的话),以防它像命名错误的字段一样简单。

如果所有这些都失败了,我会尝试缩小范围,如果这是客户端或服务器端的问题,尝试编写一个普通的python客户端,然后看看您是否也有同样的问题。环顾四周,可以看到:http://atlee.ca/software/poster/可能很有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5052630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档