代码之家  ›  专栏  ›  技术社区  ›  Jon Cox

烧瓶/蟒蛇。从上载的文件获取mimetype

  •  9
  • Jon Cox  · 技术社区  · 15 年前

    我正在使用flask micro framework 0.6和python 2.6

    我需要从上传的文件中获取mimetype以便存储它。

    下面是相关的python/flask代码:

    @app.route('/upload_file', methods=['GET', 'POST'])
    def upload_file():
        if request.method == 'POST':
            file = request.files['file']
            mimetype = #FIXME
            if file:
                file.save(os.path.join(UPLOAD_FOLDER, 'File-Name')
                return redirect(url_for('uploaded_file'))
            else:
                return redirect(url_for('upload'))
    


    这是网页的代码:

    <form action="upload_file" method=post enctype=multipart/form-data> 
    Select file to upload: <input type=file name=file> 
    <input type=submit value=Upload> 
    </form> 
    


    代码可以工作,但是我需要在上传时能够得到mimetype。我看过这里的烧瓶文件: http://flask.pocoo.org/docs/api/#incoming-request-data
    所以我知道它确实得到了mimetype,但我不知道如何检索它-作为文本字符串,例如“txt/plain”。

    有什么想法吗?

    谢谢您。

    2 回复  |  直到 8 年前
        1
  •  20
  •   davidism    9 年前

    docs , file.content_type 包含带编码的完整类型, mimetype 只包含mime类型。

    @app.route('/upload_file', methods=['GET', 'POST'])
    def upload_file():
        if request.method == 'POST':
            file = request.files.get('file')
            if file:
                mimetype = file.content_type
                filename = werkzeug.secure_filename(file.filename)
                file.save(os.path.join(UPLOAD_FOLDER, filename)
                return redirect(url_for('uploaded_file'))
            else:
                return redirect(url_for('upload'))
    
        2
  •  2
  •   charlax    8 年前

    理论上你可以用 request.files['YOUR_FILE_KEY'].content_type ,但实现(包括以下内容,可在 werkzeug.datastructures )要么信任客户提供的任何内容,要么使用 mimetypes.guess_type 它只检查文件扩展名(参见python文档 here )

    class FileMultiDict(MultiDict):
    
        """A special :class:`MultiDict` that has convenience methods to add
        files to it.  This is used for :class:`EnvironBuilder` and generally
        useful for unittesting.
        .. versionadded:: 0.5
        """
    
        def add_file(self, name, file, filename=None, content_type=None):
            """Adds a new file to the dict.  `file` can be a file name or
            a :class:`file`-like or a :class:`FileStorage` object.
            :param name: the name of the field.
            :param file: a filename or :class:`file`-like object
            :param filename: an optional filename
            :param content_type: an optional content type
            """
            if isinstance(file, FileStorage):
                value = file
            else:
                if isinstance(file, string_types):
                    if filename is None:
                        filename = file
                    file = open(file, 'rb')
                if filename and content_type is None:
                    content_type = mimetypes.guess_type(filename)[0] or \
                        'application/octet-stream'
                value = FileStorage(file, filename, name, content_type)
    
            self.add(name, value)
    

    根据您的用例,您可能希望使用 python-magic 它将使用实际文件来获取mimetype。就像这样:

    import magic
    
    
    def get_mimetype(data: bytes) -> str:
        """Get the mimetype from file data."""
        f = magic.Magic(mime=True)
        return f.from_buffer(data)
    
    
    get_mimetype(request.files['YOUR_FILE_KEY'].stream.read(MAX_LENGTH))
    
    推荐文章