简体   繁体   English

使用RESTAPI上传图像

[英]upload images using RESTAPI

I am working with an app using Django Rest Framework. 我正在使用Django Rest Framework处理应用程序。

models.py models.py

class Image(models.Model):
    image_meta = models.ForeignKey('Image_Meta',on_delete=models.CASCADE,)
    image_path = models.URLField(max_length=200)
    order = models.IntegerField()
    version = models.CharField(max_length=10)

serializers.py serializers.py

class ImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Image
        field = ('id', 'image_path' , 'order' , 'version')

views.py views.py

class ImageList(generics.ListCreateAPIView):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer

class ImageDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer

url patterns 网址模式

url(r'^image/$',views.ImageList.as_view(),name='image_list'),
url(r'^image/(?P<pk>[0-9]+)/$',views.ImageDetail.as_view(),name='image_detail')

This is just a part of the whole system. 这只是整个系统的一部分。 I want to upload images using the RESTAPI and then upload it to amazon s3 and from there get the url and store it in the image_path field of the model Image. 我想使用RESTAPI上传图像,然后将其上传到amazon s3,然后从那里获取url并将其存储在模型Image的image_path字段中。 I have seen previous solutions for uploading files using REST ( like this )but nothing worked for my case. 我已经看到以前使用REST上传文件的解决方案( 像这样 ),但对我的情况没有任何效果。 Can someone suggest how can I do that? 有人可以建议我该怎么做?

We know that images/files are uploaded using multipart/form-data . 我们知道使用multipart / form-data上传图像/文件。 By Default DRF don't parse multipart data. 默认情况下,DRF不会解析多部分数据。

To make drf parse multipart data you have to tell DRP view to use MultiPartParser parser. 要使drf解析多部分数据,您必须告诉DRP视图使用MultiPartParser解析器。

from rest_framework.parsers import MultiPartParser
class ImageList(generics.ListCreateAPIView):
    ...
    ...     
    parser_classes = (MultiPartParser)
    ...

I'll recommend to have a imagefield in your serializer for image field, and process it there to upload to amazon and populate URLField 我建议有一个ImageField的在你的串行图像领域,处理它那里上传到亚马逊和填充URLField

Well I finally have figured out how this can be done. 好吧,我终于弄清楚如何做到这一点。 I changed the image_path to ImageField as suggested by Saurabh Goyal. 我按照Saurabh Goyal的建议将image_path更改为ImageField。 I used this code: 我用过这段代码:

class Image(models.Model):
    image_meta = models.ForeignKey('Image_Meta',on_delete=models.CASCADE,)
    image_path = models.ImageField(upload_to='images-data')
    order = models.IntegerField()
    version = models.CharField(max_length=10)

N provided my amazon s3 bucket details as in the local_settings.py file as : N在local_settings.py文件中提供了我的amazon s3存储桶详细信息,如下所示:

AWS_S3_ACCESS_KEY_ID = "Access_key_id"
AWS_S3_SECRET_ACCESS_KEY = "secret_access_key"
AWS_STORAGE_BUCKET_NAME = "bucket_name"

and added this to settings.py : 并将其添加到settings.py

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

and voila!! 瞧!! It worked. 有效。 I hope this helps someone stuck at the same problem as me. 我希望这可以帮助有人和我一样陷入同样的​​问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM