Aiogram отправка фото на сервер, как присвоить имя файла?

Рейтинг: 0Ответов: 1Опубликовано: 22.03.2023

Написал бота для загрузки фото на сервер. Всё работает, только сохраняет файл в виде X:\photo019\photos\file_77.jpg. Подскажите, как сделать, чтобы добавлялась дата, например file_77_23.03.2023.jpg или X:\photo019_23.03.2023\photos\file_77.jpg либо как то иначе для исключения путаницы.

Вот мой код:

API_TOKEN = ""
button1 = KeyboardButton('019')
button2 = KeyboardButton('036')
greet_kb = ReplyKeyboardMarkup(resize_keyboard=True).row(
    button1, button2)
logging.basicConfig(level=logging.INFO)
Bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(Bot,storage=MemoryStorage())
button_checked = ['019', '036']
class Users_(StatesGroup):
    users = State()
    photo = State()
@dp.message_handler(commands=['start'], state="*")
async def process_start_command(message: types.Message, 
state:FSMContext):
    await message.reply("Выбери свой номер", reply_markup=greet_kb)
    await state.set_state(Users_.users.state)
@dp.message_handler(state = Users_.users)
async def get_users(message: types.Message, state: FSMContext):
    if message.text not in button_checked:
        await message.answer("Пожалуйста, свой номер")
        return
    await state.update_data(user_name = message.text)
    await state.set_state(Users_.photo.state)
    await message.answer('Теперь загрузи фото:', 
reply_markup=ReplyKeyboardRemove())
@dp.message_handler(content_types=['photo'], state = Users_.photo)
async def download_photo(message: types.Message, state:FSMContext):
    file = await Bot.get_file(message.photo[-1].file_id)
    user_data = await state.get_data()
#__________________________добавил        
x = datetime.now()
file_name = x.strftime('%d.%m.%Y')
dirr = f'X:\photo'+user_data['user_name']
    if (user_data['user_name'] == '019'):
        with open('019', 'wb') as new_file:
            #await file.download(destination_dir=(dirr)) изменил на           
            await file.download(destination_dir=(dirr + 
f'{file_name}'))

    if(user_data['user_name'] == '036'):
        with open('036', 'wb') as new_file:
                await file.download(destination_dir=(dirr))
        await message.answer(f"Ваш номер: {user_data['user_name']}, Фото 
   загружено")
        return`
        await state.finish()
        if __name__ == '__main__':
        executor.start_polling(dp, skip_updates=True)

Получилось

X:\01923.03.2023\photos\file_77.jpg

Что не очень удобно подскажите как сделать, чтобы было

X:\019\23.03.2023\photos\file_77.jpg

Ответы

▲ 0
import time
import random
sec = int(time.time()) #время, выраженное в секундах с начала эпохи.
print(f'Загрузить файл - photo_{sec * random.randint(1,100)}.jpg')

Вывод:

Загрузить файл - photo_31909897719    
Загрузить файл - photo_40307239248     
Загрузить файл - photo_68858200382    
Загрузить файл - photo_55422453966  
Загрузить файл - photo_80614478544      
Загрузить файл - photo_149472678967

Я если честно даже не знаю, насколько это не элегантно, но в целом, на какое-то время может помочь. Если есть на сервере БД, то можно сохранять время с начала эпохи умноженное на рандомное число от 1 до 100 как id фотографии, а после допилить и проверку на валидность, в любом случае время не стоит на месте, и совпадения близятся к нулю. Но я бы перестраховался. И если файл с таким именем существует, я бы просто повторил процедуру загрузки.