django-piston模块可以创建上传图片restful webservice

时间:2010-05-14 20:42:39

标签: django django-piston

我尝试上传图像的宁静服务器,通过使用django-piston我可以放置,获取,发布信息,但不知道如何上传图像。

4 个答案:

答案 0 :(得分:0)

非常。

从技术上讲,它只是一个http帖子。

答案 1 :(得分:0)

一方面,是的。如果你有图像数据,可以通过post发送给知道如何处理它的处理程序;如果你做对了,从理论上讲,它应该在request.FILES中提供给你的处理程序。简单的HTTP。

另一方面,没有。为了像这样进行AJAX上传,您必须以某种方式获取图像数据,而无需用户实际提交表单。这就是“ajax上传表单”难以实现的原因,并且通常使用隐藏的iframe等技巧来完成他们的工作。

据我所知,只有Firefox及其gecko kin允许通过File object's getAsBinary()方法访问文件字段的二进制内容。

答案 2 :(得分:0)

你当然可以做POST。文件将在request.FILES中可用(活塞不会妨碍这一点)。

为了执行PUT,我们必须对活塞进行一些更改以支持x-method-override标头。这就是我从闪存中允许PUT和DEL的方法。 (不要忘记在执行POST时添加标题以使其被解释为PUT)

以下是一些示例中间件:

class x_http_methodoverride_middleware():
    def process_request(self, request):
        if 'HTTP_X_HTTP_METHODOVERRIDE' in request.META:
            newMethod = request.META['HTTP_X_HTTP_METHODOVERRIDE']
            if 'PUT' == newMethod.upper():
                request.method = 'PUT'
                request.META['REQUEST_METHOD'] = 'PUT'
                request.PUT = request.POST                
            if 'DELETE' == newMethod.upper() or 'DEL' == newMethod.upper():
                request.method = 'DELETE'
                request.META['REQUEST_METHOD'] = 'DELETE'
                request.DELETE = request.POST

(代码来自这里开放的活塞票http://bitbucket.org/jespern/django-piston/issue/83/use-x-http-method-override-to-override-put

答案 3 :(得分:0)

您可以在此处找到两个答案:http://groups.google.com/group/django-piston/browse_thread/thread/6f3f964b8b3ccf72/bd1658121bb1874c?show_docid=bd1658121bb1874c&pli=1

一种方法是使用request.FILES获取文件名,然后保存图像:

def create(self, request, nickname): 
    name = request.FILES["image"].name 
    image = PIL.Image.open(request.FILES["image"]) 
    image.save(SOME_PATH+name) 
    return rc.ALL_OK 

第二个建议是定义一个Image模型和一个ImageForm表单,并使用它们:

def create(self, request, nickname):
    form = ImageForm(request.POST, request.FILES)
    if form.is_valid():
        Image.objects.create(image=form.cleaned_data['image'])
        return rc.ALL_OK
    return rc.BAD_REQUEST

警告:我没有测试过这两种方法!