Baňka / Python. Získat MIME z nahraného souboru

hlasů
7

Používám Flask mikro-rámec 0.6 a 2.6 Python

Musím se dostat na MIME z nahraného souboru, takže jsem jej uložit.

Zde je relevent Python / Flask kód:

@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'))


A tady je kód pro webové stránky:

<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> 


Kód funguje, ale potřebuji, aby bylo možné získat MIME typ, když nahraje. Měl jsem se podívat na baňky docs zde: http://flask.pocoo.org/docs/api/#incoming-request-data
Takže vím, že to dělá ten MIME typ, ale nemůžu vymyslet, jak načíst ho - jako textový řetězec, například ‚txt / plain‘.

Nějaké nápady?

Děkuji.

Položena 10/08/2010 v 11:14
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
18

Z dokumentů , file.content_typeobsahuje úplný typ s kódováním, mimetypeobsahuje pouze typ 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'))
Odpovězeno 10/08/2010 v 11:41
zdroj uživatelem

hlasů
0

Dalo by se při použití teorie request.files['YOUR_FILE_KEY'].content_type, ale implementace (dále zahrnuty, nalezený v werkzeug.datastructures ) buď důvěru, co se klient poskytující nebo použití mimetypes.guess_type, který jen kontroluje příponu souboru (viz Python doc zde ).

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)

V závislosti na použití případ, možná budete chtít použít python-kouzlo , které bude používat aktuální soubor získat MIME. Bylo by něco takového:

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))
Odpovězeno 17/07/2018 v 14:58
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more