test_minio.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import io
  2. from datetime import timedelta
  3. from minio import Minio
  4. from minio.error import S3Error
  5. # 1. 初始化客户端
  6. # 配置信息来源于用户最新提供
  7. ENDPOINT = "192.168.91.15:19000"
  8. ACCESS_KEY = "2I8pipSfCa7tgBzGEZQJ"
  9. SECRET_KEY = "468kSI3wKWix5ThlBOVuRRUst8ImudH3aSCyOwmQ"
  10. BUCKET_NAME = "auto"
  11. BASE_PATH = "sampledata"
  12. client = Minio(
  13. ENDPOINT,
  14. access_key=ACCESS_KEY,
  15. secret_key=SECRET_KEY,
  16. secure=False # 使用 HTTP
  17. )
  18. def upload_file(file_path: str, content: bytes, content_type: str = "application/octet-stream"):
  19. """
  20. 上传文件到 MinIO
  21. Args:
  22. file_path: 文件路径(相对于 sampledata/),如 "test/hello.txt"
  23. content: 文件内容(bytes)
  24. content_type: MIME 类型
  25. """
  26. object_name = f"{BASE_PATH}/{file_path}"
  27. try:
  28. result = client.put_object(
  29. BUCKET_NAME,
  30. object_name,
  31. io.BytesIO(content),
  32. length=len(content),
  33. content_type=content_type
  34. )
  35. print(f"上传成功:{result.object_name}, ETag: {result.etag}")
  36. return result
  37. except S3Error as e:
  38. print(f"上传失败: {e}")
  39. def download_file(file_path: str) -> bytes:
  40. """
  41. 从 MinIO 下载文件
  42. Args:
  43. file_path: 文件路径(相对于 sampledata/)
  44. Returns:
  45. 文件内容 (bytes)
  46. """
  47. object_name = f"{BASE_PATH}/{file_path}"
  48. try:
  49. response = client.get_object(BUCKET_NAME, object_name)
  50. content = response.read()
  51. response.close()
  52. response.release_conn()
  53. return content
  54. except S3Error as e:
  55. print(f"下载失败: {e}")
  56. return b""
  57. def list_files(prefix: str = "", recursive: bool = True):
  58. """
  59. 列出指定路径下的文件
  60. Args:
  61. prefix: 路径前缀 (相对于 sampledata/)
  62. recursive: 是否递归列出子目录
  63. """
  64. full_prefix = f"{BASE_PATH}/{prefix}" if prefix else f"{BASE_PATH}/"
  65. try:
  66. objects = client.list_objects(BUCKET_NAME, prefix=full_prefix, recursive=recursive)
  67. files = []
  68. for obj in objects:
  69. files.append({
  70. "name": obj.object_name,
  71. "size": obj.size,
  72. "last_modified": obj.last_modified
  73. })
  74. return files
  75. except S3Error as e:
  76. print(f"获取文件列表失败: {e}")
  77. return []
  78. def delete_file(file_path: str):
  79. """
  80. 删除文件
  81. Args:
  82. file_path: 文件路径(相对于 sampledata/)
  83. """
  84. object_name = f"{BASE_PATH}/{file_path}"
  85. try:
  86. client.remove_object(BUCKET_NAME, object_name)
  87. print(f"删除成功:{object_name}")
  88. except S3Error as e:
  89. print(f"删除失败: {e}")
  90. def get_presigned_url(file_path: str, expires: int = 3600):
  91. """
  92. 生成预签名下载 URL
  93. Args:
  94. file_path: 文件路径(相对于 sampledata/)
  95. expires: 过期时间(秒),默认1小时
  96. """
  97. object_name = f"{BASE_PATH}/{file_path}"
  98. try:
  99. url = client.presigned_get_object(
  100. BUCKET_NAME,
  101. object_name,
  102. expires=timedelta(seconds=expires)
  103. )
  104. return url
  105. except S3Error as e:
  106. print(f"生成预签名URL失败: {e}")
  107. def get_presigned_upload_url(file_path: str, expires: int = 3600):
  108. """
  109. 生成预签名上传 URL
  110. Args:
  111. file_path: 文件路径(相对于 sampledata/)
  112. expires: 过期时间(秒),默认1小时
  113. """
  114. object_name = f"{BASE_PATH}/{file_path}"
  115. try:
  116. url = client.presigned_put_object(
  117. BUCKET_NAME,
  118. object_name,
  119. expires=timedelta(seconds=expires)
  120. )
  121. return url
  122. except S3Error as e:
  123. print(f"生成上传URL失败: {e}")
  124. if __name__ == "__main__":
  125. # 测试流程
  126. test_filename = "file/hello_world.txt"
  127. test_content = b"Hello, MinIO! This is a test file."
  128. print("--- 1. 上传测试 ---")
  129. upload_file(test_filename, test_content, "text/plain")
  130. print("\n--- 2. 列表测试 ---")
  131. files = list_files("test/")
  132. for f in files:
  133. print(f"文件: {f['name']},大小:{f['size']} bytes")
  134. print("\n--- 3. 下载测试 ---")
  135. content = download_file(test_filename)
  136. print(f"下载内容: {content.decode('utf-8')}")
  137. print("\n--- 4. 预签名 URL 测试 ---")
  138. download_url = get_presigned_url(test_filename)
  139. print(f"下载链接:{download_url}")
  140. upload_url = get_presigned_upload_url("test/upload_via_url.txt")
  141. print(f"上传链接:{upload_url}")
  142. print("(可使用 requests.put(upload_url, data=b'content') 测试上传)")
  143. print("\n--- 5. 删除测试 ---")
  144. delete_file(test_filename)
  145. print("\n测试完成。")