Spaces:
Build error
Build error
from flask import Response | |
from flask_restful import Resource, reqparse | |
from werkzeug.exceptions import Forbidden, NotFound | |
from controllers.files import api | |
from controllers.files.error import UnsupportedFileTypeError | |
from core.tools.tool_file_manager import ToolFileManager | |
class ToolFilePreviewApi(Resource): | |
def get(self, file_id, extension): | |
file_id = str(file_id) | |
parser = reqparse.RequestParser() | |
parser.add_argument("timestamp", type=str, required=True, location="args") | |
parser.add_argument("nonce", type=str, required=True, location="args") | |
parser.add_argument("sign", type=str, required=True, location="args") | |
parser.add_argument("as_attachment", type=bool, required=False, default=False, location="args") | |
args = parser.parse_args() | |
if not ToolFileManager.verify_file( | |
file_id=file_id, | |
timestamp=args["timestamp"], | |
nonce=args["nonce"], | |
sign=args["sign"], | |
): | |
raise Forbidden("Invalid request.") | |
try: | |
stream, tool_file = ToolFileManager.get_file_generator_by_tool_file_id( | |
file_id, | |
) | |
if not stream or not tool_file: | |
raise NotFound("file is not found") | |
except Exception: | |
raise UnsupportedFileTypeError() | |
response = Response( | |
stream, | |
mimetype=tool_file.mimetype, | |
direct_passthrough=True, | |
headers={}, | |
) | |
if tool_file.size > 0: | |
response.headers["Content-Length"] = str(tool_file.size) | |
if args["as_attachment"]: | |
response.headers["Content-Disposition"] = f"attachment; filename={tool_file.name}" | |
return response | |
api.add_resource(ToolFilePreviewApi, "/files/tools/<uuid:file_id>.<string:extension>") | |