@csrf_exempt
def upload_folder_to_gcs(request):
folder = request.FILES.getlist('folder') # 假设前端上传的文件夹字段名为 'folder'
if not folder:
return JsonResponse({'error': 'No folder uploaded'})
# client = storage.Client.from_service_account_json("./chrome cloud 的鉴权文件.json") # 当鉴权文件存放在本地的时候
client = storage.Client.from_service_account_info(settings.GS_CREDENTIALS) # 将鉴权文件直接写在 setting 里面,在 setting中这么写:
"""
部署的时候通常写在环境变量里面
if IS_HEROKU_APP:
GS_CREDENTIALS = json.loads(os.environ.get('GS_CREDENTIALS')) # 部署的时候没法读,所以读 heroku 的环境变量
else:
with open('./鉴权文件.json', 'r') as f:
GS_CREDENTIALS = json.load(f)
"""
# 提前在 settings 中配置好存储桶的名称
bucket_name = settings.GS_BUCKET_NAME
print(bucket_name)
try:
bucket = client.get_bucket(bucket_name)
except Exception as e:
print(e)
# 存储桶不存在,创建存储桶
bucket = client.create_bucket(bucket_name)
# 遍历所有文件并直接上传到存储桶
for file in folder:
blob = bucket.blob(file.name)
blob.upload_from_file(file)
return JsonResponse({'message': 'success'})
代码片段是一个用于将文件夹中的文件上传到Google Cloud Storage(GCS)的Django视图函数。以下是该代码的功能概述:
视图函数使用@csrf_exempt
修饰符,表示该端点不需要CSRF令牌验证。
它通过字段名 'folder'
(原生的 html 表单上传,如果是 vue 的 element-ui 组件,则是用 file 字段)从请求对象中获取上传的文件夹。如果没有上传文件夹,则返回一个带有错误消息的JSON响应。
代码使用在settings.GS_CREDENTIALS
变量中提供的Google Cloud Storage凭据来对客户端进行身份验证。凭据可以根据部署情况存储在本地或作为环境变量。
GCS存储桶名称在设置文件中预先配置,并使用settings.GS_BUCKET_NAME
变量进行设置。
代码尝试使用client.get_bucket()
获取指定的GCS存储桶。如果桶不存在,则使用client.create_bucket()
创建新的存储桶。
它遍历上传文件夹中的每个文件,并使用blob.upload_from_file()
将它们直接上传到GCS存储桶中。
最后,它返回一个包含成功消息的JSON响应,指示文件夹上传到GCS
成功。
总体而言,该视图函数处理了将文件夹中的文件上传到GCS
的过程,确保进行了必要的身份验证,并正确地将文件上传到指定的存储桶中。