2

我有一个 Django 应用程序,它允许用户上传保存在 Azure blob 存储中的图像。当用户上传图片时,我想存储原始图片并创建缩略图(100x100)。

目前,该站点完美地上传原件request.FILES,但是为了创建缩略图,我无法弄清楚如何在不先将编辑后的图像保存到保存文件夹、读取保存的图像然后删除它的情况下上传到 Azure。这似乎不是保存缩略图的最有效方法。

这是当前的上传脚本:

# original upload
f = request.FILES['pic']
extension = f.name.split('.')[-1]
new_name, thumb_name = rename_file(extension)
upload(blob_service, 'pic-container', new_name, f)

# create thumbnail
f.seek(0)
im = Image.open(f)
width = im.size[0]
height = im.size[1]
if width > height:
    left_crop = (width - height)/2
    right_crop = (width + height)/2
    cropped = im.crop((left_crop, 0, right_crop, height))
else:
    upper_crop = (height - width)/2
    lower_crop = (height + width)/2
    cropped = im.crop((0, upper_crop, width, lower_crop))
std_size = 100, 100
cropped.thumbnail(std_size, Image.ANTIALIAS)

# save to holder, upload thumbnail, then delete from holder
cropped.save('path/to/holder/' + thumb_name)
upload(blob_service, 'media-pic', thumb_name, open('path/to/holder/' + thumb_name))
os.unlink('path/to/holder/' + thumb_name)

# upload script slightly modified from http://www.windowsazure.com/en-us/documentation/articles/storage-python-how-to-use-blob-storage/#_large-blobs
def upload(blob_service, container_name, blob_name, file_path):
    blob_service.put_blob(container_name, blob_name, '', 'BlockBlob')

    block_ids = []
    index = 0
    with file_path as f:
        while True:
            data = f.read(chunk_size)
            if data:
                length = len(data)
                block_id = base64.b64encode(str(index))
                blob_service.put_block(container_name, blob_name, data, block_id)
                block_ids.append(block_id)
                index += 1
            else:
                break

    blob_service.put_block_list(container_name, blob_name, block_ids)

如果我不先保存缩略图而只是运行,upload(blob_service, 'pic-container', thumb_name, cropped)我会得到一个非常不具信息性的错误,它只是说并__exit__指向with file_path as f.def upload

有没有办法直接上传文件cropped而不必保存文件,无论是通过修改上传功能还是以cropped某种方式改变。

4

0 回答 0