通过iPhone应用程序将图像发送到django Web服务并发送

时间:2014-05-02 13:56:39

标签: django amazon-s3 boto django-storage

我有一个django网络服务。我希望能够接受来自iOS应用程序的图像,将图像保存到数据库中(图像文件本身应该放在我的s3存储桶中)。

通过管理员保存它非常容易,您只需定义upload_to并将存储桶设置为static_url,但我找不到任何有关如何保存应用程序发送的图像的示例/文档,例如

有人能指出我正确的方向还是举例?

更多信息,因为我的问题含糊不清:

class Image(models.Model):
    name = models.CharField(max_length = 255)
    caption = models.CharField(max_length = 255)
    image = models.ImageField(upload_to='uploads/',blank=True,null=True)
    rent_property = models.ForeignKey(RentProperty, related_name='Images')
    is_main_image = models.BooleanField(default=False)

setting.py

#Amazon Bucket
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = '################'
AWS_SECRET_ACCESS_KEY = '#####################'
AWS_STORAGE_BUCKET_NAME = 'string'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

这是我的图像类,我尝试做的是从应用程序获取图像,将其保存到数据库和S3存储,并将其链接到正确的外键。

我的麻烦在于了解如何在将信息保存到数据库时将文件保存到S3。

1 个答案:

答案 0 :(得分:0)

我在这里回答了一个非常相似的问题:Best way to upload image from Mobile to Django server因此你可能会被视为可能的重复。

图像是否会链接到数据库对象(可能是图像模型)?

如果是这样,请添加到上面链接的代码:

@csrf_exempt
def handle_uploads(request):
    if request.method == 'POST':
        uploaded_file = request.FILES['file']
        file_name = uploaded_file.name
        # Write content of the file chunk by chunk in a local file (destination)
        with open('path/to/destination_dir/' + file_name, 'wb+') as destination:
            for chunk in uploaded_file.chunks():
                destination.write(chunk)
        # Create your object
        obj = Image.objects.create(file_field='path/to/destination_dir/' + file_name)
        obj.save()

    response = HttpResponse('OK')
    return response

希望这有帮助,

编辑:


我可能误解了你,如果你打算使用外置存储,为什么还要问如何保存图像?你的意思是你只想保存文件名吗?或者你想让Django无缝地使用S3存储?我相信它有详细记录https://docs.djangoproject.com/en/1.6/howto/custom-file-storage/,但上面的代码需要一些返工。

发现很少:http://www.laurentluce.com/posts/upload-and-download-files-tofrom-amazon-s3-using-pythondjango/

对于你想要实现的目标来说,这似乎是完美的。只需将上传部分添加到上面的代码中,您就应该在轨道上:)