如何使用Django REST Framework将生成的TIFF文件上传至Cloudinary
解决方案
1. 配置Cloudinary Django环境
首先安装依赖包:
pip install cloudinary django-cloudinary-storage
在Django项目的settings.py中添加配置:
INSTALLED_APPS = [ # 其他已有的APP 'cloudinary', 'cloudinary_storage', ] # Cloudinary配置,替换为你的账号信息 CLOUDINARY_URL = "cloudinary://<API_KEY>:<API_SECRET>@<CLOUD_NAME>" # 可选:设置默认文件存储为Cloudinary DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.RawMediaCloudinaryStorage'
2. 上传TIFF文件到Cloudinary
方式一:直接在内存中生成并上传(推荐,避免本地文件IO)
修改你的TIFF生成逻辑,用BytesIO代替本地文件路径,直接将内存流上传到Cloudinary:
from io import BytesIO import cloudinary.uploader import rasterio # 将TIFF数据写入内存流 output_stream = BytesIO() with rasterio.open( output_stream, 'w', driver='GTiff', height=500, width=500, count=1, dtype='float32', crs='EPSG:4326', transform=rasterio.transform.from_bounds(*box2, 500, 500) ) as ndvi_image: ndvi_image.write(image, 1) # 重置流指针到起始位置 output_stream.seek(0) # 上传到Cloudinary upload_response = cloudinary.uploader.upload( output_stream, resource_type="raw", # TIFF属于原始文件类型,必须指定此参数 public_id="ndvi/ndviimage", # 自定义存储路径和文件名,避免重复 overwrite=True # 允许覆盖同名文件 ) # 上传成功后可获取文件的安全URL等信息 secure_url = upload_response['secure_url']
方式二:上传已保存的本地TIFF文件
如果需要保留本地文件,可在生成文件后直接上传:
import cloudinary.uploader import rasterio # 你的本地文件生成代码 ndvi_image = rasterio.open( 'ndviimage.tif', 'w', driver='GTiff', height=500, width=500, count=1, dtype='float32', crs='EPSG:4326', transform=rasterio.transform.from_bounds(*box2, 500, 500) ) ndvi_image.write(image, 1) ndvi_image.close() # 上传本地文件 upload_response = cloudinary.uploader.upload( 'ndviimage.tif', resource_type="raw", public_id="ndvi/ndviimage", overwrite=True )
3. 结合Django ORM使用(可选)
如果需要将TIFF文件关联到Django模型,可使用CloudinaryField:
# models.py from django.db import models from cloudinary.models import CloudinaryField class NDVIRecord(models.Model): tiff_file = CloudinaryField(resource_type='raw') # 其他字段... # 视图中使用 from .models import NDVIRecord # 生成内存流后 output_stream.seek(0) record = NDVIRecord() record.tiff_file.save('ndviimage.tif', output_stream, save=True)
内容的提问来源于stack exchange,提问作者Zafar Ijaz Khan Niazi
相关产品推荐
相关产品推荐

