Python应用上传文件至MinIO Bucket出现空文件问题求助
解决MinIO Python上传文件大小为0的问题
问题根源
上传后文件大小为0,核心原因是Flask的FileStorage对象指针不在文件起始位置。当你获取file.content_length后,文件指针可能已移动到末尾,导致put_object读取时没有内容可上传。
解决方案
方案一:重置文件指针(推荐)
在调用minio_client.put_object前,添加file.seek(0)将文件指针重置到起始位置,确保完整读取文件内容。修改后的核心代码如下:
@app.route('/', methods=['GET', 'POST']) @app.route('/home', methods=['GET', 'POST']) def home(): form = UploadFileForm() if form.validate_on_submit(): file = form.file.data filename = secure_filename(file.filename) bucket_name = "saving-files" try: content_type = get_content_type(filename) # 关键:重置文件指针到起始位置 file.seek(0) minio_client.put_object(bucket_name, filename, file, file.content_length, content_type=content_type) return "File has been uploaded to MinIO." except S3Error as e: return f"Error uploading file to MinIO: {e}" return render_template('index.html', form=form)
方案二:改用upload_file方法
如果你不想手动处理指针,可使用MinIO的upload_file方法,该方法会自动处理文件读取逻辑,需要先将文件临时保存:
import tempfile @app.route('/', methods=['GET', 'POST']) @app.route('/home', methods=['GET', 'POST']) def home(): form = UploadFileForm() if form.validate_on_submit(): file = form.file.data filename = secure_filename(file.filename) bucket_name = "saving-files" try: content_type = get_content_type(filename) # 临时保存文件到本地 with tempfile.NamedTemporaryFile(delete=False) as temp_file: file.save(temp_file.name) # 调用upload_file上传 minio_client.upload_file(temp_file.name, bucket_name, filename, content_type=content_type) # 删除临时文件 os.unlink(temp_file.name) return "File has been uploaded to MinIO." except S3Error as e: return f"Error uploading file to MinIO: {e}" return render_template('index.html', form=form)
验证方式
修改代码后重新上传文件,检查MinIO Bucket中文件的大小是否与原文件一致,下载打开确认内容完整即可。
内容的提问来源于stack exchange,提问作者user23933968
相关产品推荐
相关产品推荐

