| 
									
										
										
										
											2024-04-29 18:22:03 +08:00
										 |  |  | import base64 | 
					
						
							| 
									
										
										
										
											2024-05-15 09:05:41 +09:00
										 |  |  | import io | 
					
						
							| 
									
										
										
										
											2024-06-13 18:36:34 +09:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2024-04-29 18:22:03 +08:00
										 |  |  | from collections.abc import Generator | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-11 16:40:52 +08:00
										 |  |  | from google.cloud import storage as google_cloud_storage | 
					
						
							| 
									
										
										
										
											2024-04-29 18:22:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  | from configs import dify_config | 
					
						
							| 
									
										
										
										
											2024-04-29 18:22:03 +08:00
										 |  |  | from extensions.storage.base_storage import BaseStorage | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-09 14:15:27 +08:00
										 |  |  | class GoogleCloudStorage(BaseStorage): | 
					
						
							|  |  |  |     """Implementation for Google Cloud storage.""" | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-22 11:01:32 +08:00
										 |  |  |     def __init__(self): | 
					
						
							|  |  |  |         super().__init__() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.bucket_name = dify_config.GOOGLE_STORAGE_BUCKET_NAME | 
					
						
							|  |  |  |         service_account_json_str = dify_config.GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64 | 
					
						
							| 
									
										
										
										
											2024-05-15 09:05:41 +09:00
										 |  |  |         # if service_account_json_str is empty, use Application Default Credentials | 
					
						
							|  |  |  |         if service_account_json_str: | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  |             service_account_json = base64.b64decode(service_account_json_str).decode("utf-8") | 
					
						
							| 
									
										
										
										
											2024-06-13 18:36:34 +09:00
										 |  |  |             # convert str to object | 
					
						
							|  |  |  |             service_account_obj = json.loads(service_account_json) | 
					
						
							| 
									
										
										
										
											2024-09-11 16:40:52 +08:00
										 |  |  |             self.client = google_cloud_storage.Client.from_service_account_info(service_account_obj) | 
					
						
							| 
									
										
										
										
											2024-05-15 09:05:41 +09:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2024-09-11 16:40:52 +08:00
										 |  |  |             self.client = google_cloud_storage.Client() | 
					
						
							| 
									
										
										
										
											2024-04-29 18:22:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def save(self, filename, data): | 
					
						
							|  |  |  |         bucket = self.client.get_bucket(self.bucket_name) | 
					
						
							|  |  |  |         blob = bucket.blob(filename) | 
					
						
							| 
									
										
										
										
											2024-05-15 09:05:41 +09:00
										 |  |  |         with io.BytesIO(data) as stream: | 
					
						
							|  |  |  |             blob.upload_from_file(stream) | 
					
						
							| 
									
										
										
										
											2024-04-29 18:22:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def load_once(self, filename: str) -> bytes: | 
					
						
							|  |  |  |         bucket = self.client.get_bucket(self.bucket_name) | 
					
						
							|  |  |  |         blob = bucket.get_blob(filename) | 
					
						
							|  |  |  |         data = blob.download_as_bytes() | 
					
						
							|  |  |  |         return data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def load_stream(self, filename: str) -> Generator: | 
					
						
							| 
									
										
										
										
											2024-10-25 10:11:25 +08:00
										 |  |  |         bucket = self.client.get_bucket(self.bucket_name) | 
					
						
							|  |  |  |         blob = bucket.get_blob(filename) | 
					
						
							|  |  |  |         with blob.open(mode="rb") as blob_stream: | 
					
						
							|  |  |  |             while chunk := blob_stream.read(4096): | 
					
						
							|  |  |  |                 yield chunk | 
					
						
							| 
									
										
										
										
											2024-04-29 18:22:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def download(self, filename, target_filepath): | 
					
						
							|  |  |  |         bucket = self.client.get_bucket(self.bucket_name) | 
					
						
							|  |  |  |         blob = bucket.get_blob(filename) | 
					
						
							| 
									
										
										
										
											2024-06-13 18:36:34 +09:00
										 |  |  |         blob.download_to_filename(target_filepath) | 
					
						
							| 
									
										
										
										
											2024-04-29 18:22:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def exists(self, filename): | 
					
						
							|  |  |  |         bucket = self.client.get_bucket(self.bucket_name) | 
					
						
							|  |  |  |         blob = bucket.blob(filename) | 
					
						
							|  |  |  |         return blob.exists() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def delete(self, filename): | 
					
						
							|  |  |  |         bucket = self.client.get_bucket(self.bucket_name) | 
					
						
							| 
									
										
										
										
											2024-08-15 12:54:05 +08:00
										 |  |  |         bucket.delete_blob(filename) |