Flask / Python. احصل على mimetype من ملف تم تحميله
سؤال
أنا أستخدم 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".
أيه أفكار؟
شكرًا لك.
المحلول
من مستندات, 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'))
نصائح أخرى
يمكنك من الناحية النظرية الاستخدام request.files['YOUR_FILE_KEY'].content_type
, ، لكن التنفيذ (المدرج أدناه ، الموجود في Werkzeug.Datuctures) إما أن تثق في كل ما يقدمه العميل أو يستخدمه mimetypes.guess_type
الذي يتحقق فقط من تمديد الملف (انظر Dothon Doc هنا).
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)
اعتمادًا على حالة الاستخدام الخاصة بك ، قد ترغب في استخدامها بيثون ماجيك والتي ستستخدم الملف الفعلي للحصول على 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))