file.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from flask import current_app, request
  2. from flask_login import current_user
  3. from flask_restful import Resource, marshal_with
  4. import services
  5. from controllers.console import api
  6. from controllers.console.datasets.error import (
  7. FileTooLargeError,
  8. NoFileUploadedError,
  9. TooManyFilesError,
  10. UnsupportedFileTypeError,
  11. )
  12. from controllers.console.setup import setup_required
  13. from controllers.console.wraps import account_initialization_required
  14. from fields.file_fields import file_fields, upload_config_fields
  15. from libs.login import login_required
  16. from services.file_service import ALLOWED_EXTENSIONS, UNSTRUSTURED_ALLOWED_EXTENSIONS, FileService
  17. PREVIEW_WORDS_LIMIT = 3000
  18. class FileApi(Resource):
  19. @setup_required
  20. @login_required
  21. @account_initialization_required
  22. @marshal_with(upload_config_fields)
  23. def get(self):
  24. file_size_limit = current_app.config.get("UPLOAD_FILE_SIZE_LIMIT")
  25. batch_count_limit = current_app.config.get("UPLOAD_FILE_BATCH_LIMIT")
  26. image_file_size_limit = current_app.config.get("UPLOAD_IMAGE_FILE_SIZE_LIMIT")
  27. return {
  28. 'file_size_limit': file_size_limit,
  29. 'batch_count_limit': batch_count_limit,
  30. 'image_file_size_limit': image_file_size_limit
  31. }, 200
  32. @setup_required
  33. @login_required
  34. @account_initialization_required
  35. @marshal_with(file_fields)
  36. def post(self):
  37. # get file from request
  38. file = request.files['file']
  39. # check file
  40. if 'file' not in request.files:
  41. raise NoFileUploadedError()
  42. if len(request.files) > 1:
  43. raise TooManyFilesError()
  44. try:
  45. upload_file = FileService.upload_file(file, current_user)
  46. except services.errors.file.FileTooLargeError as file_too_large_error:
  47. raise FileTooLargeError(file_too_large_error.description)
  48. except services.errors.file.UnsupportedFileTypeError:
  49. raise UnsupportedFileTypeError()
  50. return upload_file, 201
  51. class FilePreviewApi(Resource):
  52. @setup_required
  53. @login_required
  54. @account_initialization_required
  55. def get(self, file_id):
  56. file_id = str(file_id)
  57. text = FileService.get_file_preview(file_id)
  58. return {'content': text}
  59. class FileSupportTypeApi(Resource):
  60. @setup_required
  61. @login_required
  62. @account_initialization_required
  63. def get(self):
  64. etl_type = current_app.config['ETL_TYPE']
  65. allowed_extensions = UNSTRUSTURED_ALLOWED_EXTENSIONS if etl_type == 'Unstructured' else ALLOWED_EXTENSIONS
  66. return {'allowed_extensions': allowed_extensions}
  67. api.add_resource(FileApi, '/files/upload')
  68. api.add_resource(FilePreviewApi, '/files/<uuid:file_id>/preview')
  69. api.add_resource(FileSupportTypeApi, '/files/support-type')