Python Cloudinary实现图像和视频上传详解
std7879 人气:0Cloudinary提供了一个API,用于将图像、视频和任何其他类型的文件上传到云端。上传到Cloudinary的文件通过安全备份和修订历史记录安全存储在云中。Cloudinary的API允许从您的服务器、直接从访问者的浏览器或移动应用程序或通过远程公共URL获取安全上传。
Cloudinary的Python SDK封装了Cloudinari的上传API并简化了集成。Python方法可用于轻松地将Python图像和视频上传到云端,Python视图助手方法可用于直接从浏览器上传到Cloudinary。
本页介绍了使用Cloudinary上传Python图像和视频的常见使用模式。
有关所有可用上传选项和参数的详细信息,请参阅媒体上传文档和上传API参考的上传方法。
注意:无论您的框架如何,Cloudinary提供的大部分功能都可以使用Python实现。如文档中所述,某些功能仅适用于Django。
提示: Cloudinary的Upload widget提供了使用CloudinarySDK向应用程序添加上传功能的替代方案,从而无需开发内部交互式上传功能。上传小部件是一个交互式、功能丰富、易于集成的用户界面,使您能够向网站添加Cloudinary上传支持。只需几行JavaScript代码,就可以轻松地将小部件嵌入到web应用程序中。有关详细信息,请参阅上载小部件文档。
服务器端上传
您可以从Python代码将图像、视频或任何其他原始文件上载到Cloudinary。上传是通过HTTPS使用基于您帐户的api_key和api_secret参数的安全协议完成的。
Python图像上传
以下方法将图像上载到云:
def upload(file, **options)
例如,上载名为“my_image.jpg”的本地图像文件:
cloudinary.uploader.upload("my_image.jpg")
要上载的文件可以指定为本地路径、远程HTTP或HTTPS URL、白名单存储桶(S3或Google storage)URL、base64数据URI或FTP URL。有关详细信息,请参见文件源选项。
有关所有可用上传选项和参数的详细信息,请参阅媒体上传文档和上传API参考的上传方法。
Python视频上传
你上传视频的方式与图片完全相同。但是,上传方法只支持上传高达100 MB的文件。要上传更大的视频,请使用upload_large方法,该方法将大文件分块上传到云端。
upload_large方法具有与upload方法相同的签名和选项,并添加了可选的chunk_size参数(默认为20 MB)。
以下示例上载Dog.mp4转换为Cloudinary,并将其存储在具有公共ID dog_closeup的双层文件夹结构中。它还执行两个急切的转换,将视频调整为正方形和小矩形。
cloudinary.uploader.upload_large("dog.mp4", resource_type = "video", public_id = "myfolder/mysubfolder/dog_closeup", chunk_size = 6000000, eager = [ { "width": 300, "height": 300, "crop": "pad", "audio_codec": "none"}, { "width": 160, "height": 100, "crop": "crop", "gravity": "south", "audio_codec": "none"}], eager_async = true, eager_notification_url = "https://mysite.example.com/notify_endpoint")
上传响应
默认情况下,上传是同步执行的。一旦完成,上传的图像或视频立即可用于转换和交付。上传调用返回一个哈希,其内容如下:
{ u'bytes': 29802, u'created_at': u'2017-06-25T17:20:30Z', u'format': u'jpg', u'height': 282, u'public_id': u'hl22acprlomnycgiudor', u'resource_type': u'image', u'secure_url': u'https://res.cloudinary.com/demo/image/upload/v1571218039/hl22acprlomnycgiudor.jpg', u'signature': u'10594f028dbc23e920fd084f8482394798edbc68', u'type': u'upload', u'url': u'http://res.cloudinary.com/demo/image/upload/v1571218039/hl22acprlomnycgiudor.jpg', u'version': 1571218039, u'width': 292 }
注意:如果您需要上传响应来返回实际图像而不是哈希,那么使用upload_resource方法(除了响应之外,它与上传方法相同)。
响应包括用于访问上传媒体资产的HTTP和HTTPS URL,以及关于上传资产的其他信息:公共ID、资源类型、宽度和高度、文件格式、文件大小(字节)、用于验证响应的签名等。
数据上传选项
Cloudinary的Python库支持从各种来源上传文件。
您可以通过指定图像文件的本地路径来上载图像。例如:
cloudinary.uploader.upload('/home/my_image.jpg')
您可以提供创建的IO对象:
cloudinary.uploader.upload(open('/tmp/image1.jpg', 'rb'))
如果您的图像已经在线公开,您可以指定其远程HTTP URL,而不是上传实际数据。在这种情况下,Cloudinary将为您从其远程URL获取图像。此选项允许更快地迁移现有图像。下面是一个示例:
cloudinary.uploader.upload('https://www.example.com/image.jpg')
如果您在AmazonS3桶中有现有的图像,您可以将Cloudinary指向其S3 URL。注意-此选项需要快速手动设置。联系我们,我们将指导您如何允许Cloudinary访问您的相关S3存储桶。
cloudinary.uploader.upload('s3://my-bucket/my-path/my-file.jpg')
注意:如果您正在Django中编写一个应用程序,其中用户通过web表单上传图像,您可以传递Django's请求的参数。上传方法的文件:
cloudinary.uploader.upload(request.FILES['file'])
Django表格和模型
如果您正在使用Django,可以使用Cloudinary的助手类将Cloudinari的上传功能集成到表单和模型中。如下面的示例所示,您可以在models.py文件中定义模型类Photo。这个类有一个CloudinaryField类的图像字段。
from django.db import models from cloudinary.models import CloudinaryField class Photo(models.Model): image = CloudinaryField('image')
在表格中。py文件定义了一个PhotoForm类,该类有一个名为CloudinaryFileField类的image的表单字段(默认情况下)。
from django.forms import ModelForm from .models import Photo class PhotoForm(ModelForm): class Meta: model = Photo
视图。py文件定义了一个名为upload的视图,该视图显示HTML上传表单,并处理图像文件的发布。这些图像由CloudinaryFileField类从Django服务器上传到Cloudinary。
from django import forms from django.http import HttpResponse from cloudinary.forms import cl_init_js_callbacks from .models import Photo from .forms import PhotoForm def upload(request): context = dict( backend_form = PhotoForm()) if request.method == 'POST': form = PhotoForm(request.POST, request.FILES) context['posted'] = form.instance if form.is_valid(): form.save() return render(request, 'upload.html', context)
以下HTML模板包括一个表单,用于将图像上载到您的服务器以上载到Cloudinary:
{% load cloudinary %} {% load url from future %} {% block body %} <div id='backend_upload'> <form action="{% url "photo_album.views.upload" %}" method="post" enctype="multipart/form-data"> {% csrf_token %} {{ backend_form }} <input type="submit" value="Upload"> </form> </div> {% endblock %}
存储了图像ID后,现在可以使用cloudinary模板标签嵌入图像或图像的转换版本:
{% load cloudinary %} {% cloudinary photo.image format="jpg" width=120 height=80 crop="fill" %}
此外,您可以在初始化CloudinaryFileField类时分配标记、应用转换或指定任何Cloudinary的上传选项。
from django.forms import ModelForm from cloudinary.forms import CloudinaryFileField from .models import Photo class PhotoForm(ModelForm): class Meta: model = Photo image = CloudinaryFileField( attrs = { 'style': "margin-top: 30px" }, options = { 'tags': "directly_uploaded", 'crop': 'limit', 'width': 1000, 'height': 1000, 'eager': [{ 'crop': 'fill', 'width': 150, 'height': 100 }] })
直接从浏览器上传
上面显示的上传示例允许您的服务器端Python代码将媒体资产上传到Cloudinary。在此流程中,如果您有一个允许用户上传图像或视频的web表单,则媒体文件的数据会首先发送到您的服务器,然后上传到Cloudinary。
一个更高效、更强大的选项是允许用户将客户端代码中的图像和视频直接从浏览器上传到Cloudinary,而不是通过服务器。这种方法允许更快的上传和更好的用户体验。它还减少了服务器的负载,降低了Python应用程序的复杂性。
您可以使用对上传端点的签名或未签名调用直接从浏览器上传文件,如使用表单上传多个文件示例所示。
对于来自客户端代码的签名上传,必须在服务器端Python代码中生成安全签名。您可以使用api_sign_request方法生成SHA签名:
cloudinary.utils.api_sign_request(params_to_sign, api_secret)
有关可用于签名上传的参数的完整列表,请参阅上传API参考中的上传方法。
加载全部内容