| 
									
										
										
										
											2024-10-21 10:43:49 +08:00
										 |  |  | import urllib.parse | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-21 02:11:40 +09:00
										 |  |  | from flask import request | 
					
						
							| 
									
										
										
										
											2024-02-06 13:21:13 +08:00
										 |  |  | from flask_login import current_user | 
					
						
							| 
									
										
										
										
											2024-10-21 17:46:24 +08:00
										 |  |  | from flask_restful import Resource, marshal_with, reqparse | 
					
						
							| 
									
										
										
										
											2024-02-06 13:21:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-27 16:06:32 +08:00
										 |  |  | import services | 
					
						
							| 
									
										
										
										
											2024-07-21 02:11:40 +09:00
										 |  |  | from configs import dify_config | 
					
						
							| 
									
										
										
										
											2024-10-21 10:43:49 +08:00
										 |  |  | from constants import DOCUMENT_EXTENSIONS | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | from controllers.console import api | 
					
						
							| 
									
										
										
										
											2024-02-06 13:21:13 +08:00
										 |  |  | from controllers.console.datasets.error import ( | 
					
						
							|  |  |  |     FileTooLargeError, | 
					
						
							|  |  |  |     NoFileUploadedError, | 
					
						
							|  |  |  |     TooManyFilesError, | 
					
						
							|  |  |  |     UnsupportedFileTypeError, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | from controllers.console.setup import setup_required | 
					
						
							| 
									
										
										
										
											2024-03-03 12:45:06 +08:00
										 |  |  | from controllers.console.wraps import account_initialization_required, cloud_edition_billing_resource_check | 
					
						
							| 
									
										
										
										
											2024-10-21 10:43:49 +08:00
										 |  |  | from core.helper import ssrf_proxy | 
					
						
							|  |  |  | from fields.file_fields import file_fields, remote_file_info_fields, upload_config_fields | 
					
						
							| 
									
										
										
										
											2024-01-12 12:34:01 +08:00
										 |  |  | from libs.login import login_required | 
					
						
							| 
									
										
										
										
											2024-10-21 10:43:49 +08:00
										 |  |  | from services.file_service import FileService | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | PREVIEW_WORDS_LIMIT = 3000 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FileApi(Resource): | 
					
						
							| 
									
										
										
										
											2023-08-16 23:14:27 +08:00
										 |  |  |     @setup_required | 
					
						
							|  |  |  |     @login_required | 
					
						
							|  |  |  |     @account_initialization_required | 
					
						
							|  |  |  |     @marshal_with(upload_config_fields) | 
					
						
							|  |  |  |     def get(self): | 
					
						
							|  |  |  |         return { | 
					
						
							| 
									
										
										
										
											2024-10-22 16:34:16 +08:00
										 |  |  |             "file_size_limit": dify_config.UPLOAD_FILE_SIZE_LIMIT, | 
					
						
							|  |  |  |             "batch_count_limit": dify_config.UPLOAD_FILE_BATCH_LIMIT, | 
					
						
							|  |  |  |             "image_file_size_limit": dify_config.UPLOAD_IMAGE_FILE_SIZE_LIMIT, | 
					
						
							|  |  |  |             "video_file_size_limit": dify_config.UPLOAD_VIDEO_FILE_SIZE_LIMIT, | 
					
						
							|  |  |  |             "audio_file_size_limit": dify_config.UPLOAD_AUDIO_FILE_SIZE_LIMIT, | 
					
						
							| 
									
										
										
										
											2023-08-16 23:14:27 +08:00
										 |  |  |         }, 200 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     @setup_required | 
					
						
							|  |  |  |     @login_required | 
					
						
							|  |  |  |     @account_initialization_required | 
					
						
							|  |  |  |     @marshal_with(file_fields) | 
					
						
							| 
									
										
										
										
											2024-08-28 18:55:47 +08:00
										 |  |  |     @cloud_edition_billing_resource_check("documents") | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     def post(self): | 
					
						
							|  |  |  |         # get file from request | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  |         file = request.files["file"] | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-21 17:46:24 +08:00
										 |  |  |         parser = reqparse.RequestParser() | 
					
						
							|  |  |  |         parser.add_argument("source", type=str, required=False, location="args") | 
					
						
							|  |  |  |         source = parser.parse_args().get("source") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         # check file | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  |         if "file" not in request.files: | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |             raise NoFileUploadedError() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if len(request.files) > 1: | 
					
						
							|  |  |  |             raise TooManyFilesError() | 
					
						
							| 
									
										
										
										
											2023-09-27 16:06:32 +08:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2024-10-21 17:46:24 +08:00
										 |  |  |             upload_file = FileService.upload_file(file=file, user=current_user, source=source) | 
					
						
							| 
									
										
										
										
											2023-09-27 16:06:32 +08:00
										 |  |  |         except services.errors.file.FileTooLargeError as file_too_large_error: | 
					
						
							|  |  |  |             raise FileTooLargeError(file_too_large_error.description) | 
					
						
							|  |  |  |         except services.errors.file.UnsupportedFileTypeError: | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |             raise UnsupportedFileTypeError() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return upload_file, 201 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FilePreviewApi(Resource): | 
					
						
							|  |  |  |     @setup_required | 
					
						
							|  |  |  |     @login_required | 
					
						
							|  |  |  |     @account_initialization_required | 
					
						
							|  |  |  |     def get(self, file_id): | 
					
						
							|  |  |  |         file_id = str(file_id) | 
					
						
							| 
									
										
										
										
											2023-09-27 16:06:32 +08:00
										 |  |  |         text = FileService.get_file_preview(file_id) | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  |         return {"content": text} | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-19 09:23:49 +00:00
										 |  |  | class FileSupportTypeApi(Resource): | 
					
						
							| 
									
										
										
										
											2023-12-18 23:24:06 +08:00
										 |  |  |     @setup_required | 
					
						
							|  |  |  |     @login_required | 
					
						
							|  |  |  |     @account_initialization_required | 
					
						
							|  |  |  |     def get(self): | 
					
						
							| 
									
										
										
										
											2024-10-21 10:43:49 +08:00
										 |  |  |         return {"allowed_extensions": DOCUMENT_EXTENSIONS} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RemoteFileInfoApi(Resource): | 
					
						
							|  |  |  |     @marshal_with(remote_file_info_fields) | 
					
						
							|  |  |  |     def get(self, url): | 
					
						
							|  |  |  |         decoded_url = urllib.parse.unquote(url) | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             response = ssrf_proxy.head(decoded_url) | 
					
						
							|  |  |  |             return { | 
					
						
							|  |  |  |                 "file_type": response.headers.get("Content-Type", "application/octet-stream"), | 
					
						
							|  |  |  |                 "file_length": int(response.headers.get("Content-Length", 0)), | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         except Exception as e: | 
					
						
							|  |  |  |             return {"error": str(e)}, 400 | 
					
						
							| 
									
										
										
										
											2023-12-18 23:24:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  | api.add_resource(FileApi, "/files/upload") | 
					
						
							|  |  |  | api.add_resource(FilePreviewApi, "/files/<uuid:file_id>/preview") | 
					
						
							|  |  |  | api.add_resource(FileSupportTypeApi, "/files/support-type") | 
					
						
							| 
									
										
										
										
											2024-10-21 10:43:49 +08:00
										 |  |  | api.add_resource(RemoteFileInfoApi, "/remote-files/<path:url>") |