浏览代码

fix: not install libmagic raise error (#13146)

非法操作 2 月之前
父节点
当前提交
304467e3f5
共有 2 个文件被更改,包括 23 次插入2 次删除
  1. 2 0
      api/Dockerfile
  2. 21 2
      api/controllers/common/helpers.py

+ 2 - 0
api/Dockerfile

@@ -58,6 +58,8 @@ RUN apt-get update \
     && apt-get install -y --no-install-recommends expat=2.6.4-1 libldap2=2.6.9+dfsg-1 perl=5.40.0-8 libsqlite3-0=3.46.1-1 zlib1g=1:1.3.dfsg+really1.3.1-1+b1 \
     # install a chinese font to support the use of tools like matplotlib
     && apt-get install -y fonts-noto-cjk \
+    # install libmagic to support the use of python-magic guess MIMETYPE
+    && apt-get install -y libmagic1 \
     && apt-get autoremove -y \
     && rm -rf /var/lib/apt/lists/*
 

+ 21 - 2
api/controllers/common/helpers.py

@@ -1,13 +1,32 @@
 import mimetypes
 import os
+import platform
 import re
 import urllib.parse
+import warnings
 from collections.abc import Mapping
 from typing import Any
 from uuid import uuid4
 
 import httpx
-import magic
+
+try:
+    import magic
+except ImportError:
+    if platform.system() == "Windows":
+        warnings.warn(
+            "To use python-magic guess MIMETYPE, you need to run `pip install python-magic-bin`", stacklevel=2
+        )
+    elif platform.system() == "Darwin":
+        warnings.warn("To use python-magic guess MIMETYPE, you need to run `brew install libmagic`", stacklevel=2)
+    elif platform.system() == "Linux":
+        warnings.warn(
+            "To use python-magic guess MIMETYPE, you need to run `sudo apt-get install libmagic1`", stacklevel=2
+        )
+    else:
+        warnings.warn("To use python-magic guess MIMETYPE, you need to install `libmagic`", stacklevel=2)
+    magic = None  # type: ignore
+
 from pydantic import BaseModel
 
 from configs import dify_config
@@ -49,7 +68,7 @@ def guess_file_info_from_response(response: httpx.Response):
         mimetype = response.headers.get("Content-Type", "application/octet-stream")
 
     # Use python-magic to guess MIME type if still unknown or generic
-    if mimetype == "application/octet-stream":
+    if mimetype == "application/octet-stream" and magic is not None:
         try:
             mimetype = magic.from_buffer(response.content[:1024], mime=True)
         except magic.MagicException: