我们如何将文件(作为多部分请求的一部分接受)发送到python中的MINIO对象存储,而无需将文件保存在本地存储中?



我正在尝试用python(Falcon(编写一个API,以接受来自多部分形式参数的文件并将该文件放入MINIO对象存储中。问题是我想将文件发送到Minio而不将其保存在任何临时位置。

Minio-python客户端有一个函数,我们可以使用它发送文件。

`put_object(bucket_name, object_name, data, length)`

其中数据是文件数据,长度是对象的总长度。 有关更多说明: https://docs.min.io/docs/python-client-api-reference.html#put_object

我在put_object函数中累积"数据"和"长度"参数的值时遇到问题。

API类中接受的文件类型为falcon_multipart.parser.Parser,无法发送到Minio。

如果我将文件写入任何临时位置,然后从所需位置读取它并发送,我可以使其工作。

谁能帮我找到解决这个问题的方法?

我尝试从解析器对象读取文件数据,并尝试将文件转换为字节io.BytesIO。但它没有奏效。

def on_post(self,req, resp):
file = req.get_param('file')
file_data = file.file.read()
file_data= io.BytesIO(file_data)
bucket_name = req.get_param('bucket_name')
self.upload_file_to_minio(bucket_name, file, file_data)

def upload_file_to_minio(self, bucket_name, file, file_data):
minioClient = Minio("localhost:9000", access_key='minio', secret_key='minio', secure=False)
try:
file_stat = sys.getsizeof(file_data)
#file_stat = file_data.getbuffer().nbytes
minioClient.put_object(bucket_name, "SampleFile" , file, file_stat)
except ResponseError as err:
print(err)
Traceback (most recent call last):
File "/home/user/.local/lib/python3.6/site-packages/minio/helpers.py", line 382, in is_non_empty_string
if not input_string.strip():
AttributeError: 'NoneType' object has no attribute 'strip'

对你的问题的回答很晚。从Falcon 3.0开始,这应该可以利用框架的原生multipart/form-data支持来实现。

有一个示例如何对 AWS S3 执行相同的任务:如何将 POST 文件(从多部分表单(直接保存到 AWS S3?

但是,据我了解,MinIO 需要 总length,这是未知的,或者,它要求您将上传包装为多部分表单。通过将相当大的(例如,8 MiB或类似(块读取到内存中,并将它们包装为分段上传部分而不在磁盘上存储任何内容,这应该是可行的。

IIRC Boto3的转移经理也会在引擎盖下为您做类似的事情。

相关内容

  • 没有找到相关文章

最新更新