Форум программистов, компьютерный форум, киберфорум
Python: Flask
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24

Открытие файла после post multipart/data запроса

30.03.2021, 20:24. Показов 6863. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Пишу api и мне нужно создать post запрос который будет передавать файл и при приеме запроса будет проверятся файл на типы (фото, аудио, файл) и отправлять боту и получать в ответ id загружоного файла. Порылся я в документаии и нашол как откривать файл запроса multipart/data но там сначало файл сохраняется а потом уже можно открыть пример на фото. Ив итоге вышло чтото такое:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
def allowed_file(filename):
    a = filename.rsplit('.', 1)[1].lower()
    if a in ('jpg', 'png'):
        return 'photo'
    elif a in ('mp3', 'ogg'):
        return 'audio'
    else:
        return 'file'
 
 
def create_url(type):
    URL = 'https://api.telegram.org/bot' + config['bot']['Token']
    if type == 'photo':
        return URL + '/sendPhoto'
    elif type == 'audio':
        return URL + '/sendAudio'
    else:
        return URL + '/sendFile'
 
@app.route('/download', methods=['POST'])
def download():
    if request.headers.get("x-api-key") == APIKEY:
        file = request.files['file']
        if file:
            file_type = allowed_file(file.filename)
            filename = secure_filename(file.filename)
            file.save(os.path.join('', filename))
            with open(filename, 'rb') as doc:
                files = {file_type: doc}
                data = {'chat_id': "668401267"}
                r = requests.post(create_url(file_type), files=files, data=data)
                answer = r.json()
                print(answer)
                if answer['ok']:
                    if type == 'photo':
                        return json.dumps({'token': answer['result'][file_type][0]['file_id']}), 200, {"Content-Type": 'application/json'}
                    else:
                        return json.dumps({'token': answer['result'][file_type]['file_id']}), 200, {"Content-Type": 'application/json'}
        return "", 204, {'Content-Type': 'application/json'}
    else:
        abort(401)
но проблема то в том что я нехочу предварительно сохранять файл а както сразу с запроса его открить не сохраняя
Python
1
2
3
4
 
file.save(os.path.join('', filename))
with open(filename, 'rb') as doc:
                files = {file_type: doc}
запрос делаю в проге advansed rest client пример запроса на втором скрине и результата на третьем
вместо doc ( переменная в который открит сохраненный файл для чтения) сразу передать открытый файл.
Очень нужна помощь нигде немогу найти ответ(
Миниатюры
Открытие файла после post multipart/data запроса   Открытие файла после post multipart/data запроса   Открытие файла после post multipart/data запроса  

0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.03.2021, 20:24
Ответы с готовыми решениями:

Составление POST multipart/form-data запроса
Просьба помочь составить POST multipart/form-data запрос. firebug выдает следующее:

POST запрос с multipart/form-data. Передача значений и файла
Добрый день. В спецификации для отправки запроса приведен пример (Id при первом обращении значение отсутствует). Взял класс из...

Создать post с multipart/form-data
объясните пожалуйста, как правильно создать post запрос с multipart/form-data на защищенный сайт https:// чтоб отправлялось примерно...

8
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
31.03.2021, 00:18
Смотри mimetype файла:
Python
1
2
3
4
 
file_ = request.files.get('file')
if file_:
   mimetype = file_.content_type
Добавлено через 3 минуты
Что такое mime типы можешь ознакомиться здесь.


Но этот вариант не определяет тип файл по содержимому, только по http заголовкам.

Поэтому есть специальная либа, которая пытается прочитать тело файла (самое начало, где указывается метаинформация)
Python
1
2
3
4
5
6
7
8
9
10
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)) # MAX_LENGTH - сколько байт читать из тела запроса
0
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24
31.03.2021, 01:44  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
ile_ = request.files.get('file')
Цитата Сообщение от Garry Galler Посмотреть сообщение
stream.read(MAX_L
так за типы я понял, а как мне файл открыть
Python
1
2
3
file.save(os.path.join('', filename))
with open(filename, 'rb') as doc:
                files = {file_type: doc}
file.save(os.path.join('', filename)) - как убрать ето сохранение в память и откритие, а сразу перенаправление сделать файла или как-то так. Просто зачем сохранять если наверное както возможно его туда отправить сразу. Зарание спасибо за ответы!
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
31.03.2021, 13:50
Цитата Сообщение от Vetaliycpp Посмотреть сообщение
как убрать ето сохранение в память и откритие
Я это и показал.
0
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24
31.03.2021, 16:44  [ТС]
я пробывал может я чтото не так делаю счас покажу что выдает:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def allowed_file(a):
    if 'image' in a:
        return 'photo'
    elif 'audio' in a:
        return 'audio'
    elif 'video' in a:
        return 'video'
    else:
        return 'document'
 
 
def create_url(type):
    URL = 'https://api.telegram.org/bot' + config['bot']['Token']
    if type == 'photo':
        return URL + '/sendPhoto'
    elif type == 'audio':
        return URL + '/sendAudio'
    else:
        return URL + '/sendDocument'
 
 
def get_mimetype(data: bytes) -> str:
    """Get the mimetype from file data."""
    f = magic.Magic(mime=True)
    return f.from_buffer(data)
 
 
@app.route('/download', methods=['POST'])
def download():
    if request.headers.get("x-api-key") == APIKEY:
        file = request.files['file']
        file_ = request.files.get('file')
        if file:
            mimetype = file_.content_type
            file_type = allowed_file(mimetype)
            files = {file_type: get_mimetype(request.files['file'].stream.read())}
            data = {'chat_id': "668401267"}
            r = requests.post(create_url(file_type), files=files, data=data)
            answer = r.json()
            print(answer)
            if answer['ok']:
                if file_type == 'photo':
                    return json.dumps({'token': answer['result'][file_type][0]['file_id']}), 200, {"Content-Type": 'application/json'}
                else:
                    return json.dumps({'token': answer['result'][file_type]['file_id']}), 200, {"Content-Type": 'application/json'}
            return json.dumps(answer), 200, {'Content-Type': 'application/json'}
    else:
        abort(401)
на скрине видно что выдает 200 но я ето зделал чтобы понимать дошло ли до запроса в бот но для бота етот файл ошибочный или как-то так:
{'ok': False, 'error_code': 400, 'description': 'Bad Request: IMAGE_PROCESS_FAILED'}
единственное что я зделал наверное не так ето не указал get_mimetype(request.files['file'].stream.read()) тут MAX_LENGTH ибо немношко непонял где его брать пробывал просто задавать много байт всеравно не проходит, наверное я чегото всетаки непонял. В чем же может быть ошибка у меня?
Миниатюры
Открытие файла после post multipart/data запроса  
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
31.03.2021, 17:54
Напиши еще раз, что так хочешь. Только очень четко.
А то я не понимаю, то ли ты хочешь узнать тип файла, то ли прочитать его из запроса как бинарное содержимое и куда-то там сразу передать, то ли все вместе.
0
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24
31.03.2021, 18:02  [ТС]
Видиш ети строчки тут я сораняю файл, и потом открываю его только уже в директории компютера и шлю в телеграм формируя такой словарь: files = {file_type: doc}. doc это файл уже на пк открыт для чтение.
Python
1
2
3
file.save(os.path.join('', filename))
            with open(filename, 'rb') as doc:
                files = {file_type: doc}
можно ли както не сохраняя файл сразу его открытым для чтение передать из request`а сюда: files = {file_type(с типами все уже норм): <открытый файл не з директории а напрямую с request`а>} без етого ненужного сохранения и открытия:
Python
1
2
file.save(os.path.join('', filename))
            with open(filename, 'rb') as doc:
я всеравно буду их удалять постоянно с компа, а в проге после запроса удалять тоже не оптимально - процес лишний
ps: Если не поняли - ничего страшного ето я так обяснять умею. обясню ещо как-то по другому если нужно .
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
31.03.2021, 18:12
Лучший ответ Сообщение было отмечено Vetaliycpp как решение

Решение

Если ты хочешь просто передать файл из обработчика фласка в requests.post, то в доке написано
files
A MultiDict with files uploaded as part of a POST or PUT request. Each file is stored as FileStorage object. It basically behaves like a standard file object you know from Python,
то есть объект файла в словаре request["file"] это FileStorage, а FileStorage имеет атрибуты:
content_length The content-length sent in the header.
content_type The content-type sent in the header.
mimetype Like content_type, but without parameters (eg, without charset, type etc.) and always lowercase.
mimetype_params The mimetype parameters as dict.

А дальше думай сам как тебе передать FileStorage в post запрос.

.... Хотя, вот первый попавшийся пример со стековерфлоу:

Python
1
2
3
4
5
6
7
8
f = request.files['file']
# c = checksumMD5(f.stream)  # это не нужно
# f.seek(0)                              # это тоже, только если ты уже ранее не пытался читать тело файла из запроса через stream
 
sendFile = {"file": (f.filename, f.stream, f.mimetype)}
 
r = requests.post("http://myservicedotcom/upload", files=sendFile,
                  headers={"X-Auth-Token": token, "Checksum": c, "File-Size": actualSize})
1
0 / 0 / 0
Регистрация: 02.11.2020
Сообщений: 24
31.03.2021, 21:23  [ТС]
все работает!!! пасибо пример кода снизу для когото нада будет)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import requests
import magic
 
def allowed_file(a):
    if 'image' in a:
        return 'photo'
    elif 'audio' in a:
        return 'audio'
    elif 'video' in a:
        return 'video'
    else:
        return 'document'
 
 
def create_url(type):
    URL = 'https://api.telegram.org/bot' + config['bot']['Token']
    if type == 'photo':
        return URL + '/sendPhoto'
    elif type == 'audio':
        return URL + '/sendAudio'
    else:
        return URL + '/sendDocument'
 
 
 
@app.route('/download', methods=['POST'])
def download():
    if request.headers.get("x-api-key") == APIKEY:
        file = request.files['file']
        if file:
            file_type = allowed_file(request.files.get('file').content_type)
            files = {file_type: (file.filename, file.stream, file.mimetype)}
            data = {'chat_id': "668401267"}
            r = requests.post(create_url(file_type), files=files, data=data)
            answer = r.json()
            print(answer)
            if answer['ok']:
                if file_type == 'photo':
                    return json.dumps({'token': answer['result'][file_type][0]['file_id']}), 200, {"Content-Type": 'application/json'}
                else:
                    return json.dumps({'token': answer['result'][file_type]['file_id']}), 200, {"Content-Type": 'application/json'}
            return json.dumps(answer), 200, {'Content-Type': 'application/json'}
    else:
        abort(401)
Код сырой не допилил ещо но суть понятна и все работает!!!
Миниатюры
Открытие файла после post multipart/data запроса  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.03.2021, 21:23
Помогаю со студенческими работами здесь

Как отправлять multipart/form-data Post?
Всем привет! есть гос сайт там есть раздел технической поддержки надоело им лазить на сайт решил написать утилиту! Вроде все сделал...

Curl post запрос в формате multipart/form-data
Не получается разобраться с данным запросом. Требуется отправить post запрос - загрузить изображения на сервер Ожидает данные в...

Oтправка multipart/form-data запроса
Здравствуйте, нужно отправить ПОСТ запрос на сервер, с контент тайпом multipart/form-datа, но не знаю как отправить такой запрос(. Вот что...

Jsoup post multipart/form-data форма обратной связи
Доброго времени суток. Стоит задача отправлять данные multipart/form-data через post запрос. На сайте это просто форма обратной связи без...

Загрузка файлов методом post через multipart/form-data
Проблема следующая: пытаюсь загрузить картинку на сервер vk.com указанным в заголовке методом. Все заголовки и всё тело запроса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru