fix(core): auto-correct invalid filenames for uploaded photos

This commit is contained in:
alina 🌸 2024-10-02 03:30:59 +03:00
parent ecddcad012
commit 6361f4f64a
Signed by: teidesu
SSH key fingerprint: SHA256:uNeCpw6aTSU4aIObXLvHfLkDa82HWH9EiOj9AXOIRpI
2 changed files with 26 additions and 0 deletions

View file

@ -258,6 +258,7 @@ export async function _normalizeInputMedia(
fileMime: sendMime, fileMime: sendMime,
fileSize: media.fileSize, fileSize: media.fileSize,
requireFileSize: media.type === 'photo', requireFileSize: media.type === 'photo',
requireExtension: media.type === 'photo',
}) })
inputFile = uploaded.inputFile inputFile = uploaded.inputFile
mime = uploaded.mime mime = uploaded.mime

View file

@ -100,6 +100,15 @@ export async function uploadFile(
* the stream will be buffered in memory and the file size will be inferred from the buffer. * the stream will be buffered in memory and the file size will be inferred from the buffer.
*/ */
requireFileSize?: boolean requireFileSize?: boolean
/**
* When using `inputMediaUploadedPhoto` (e.g. when sending an uploaded photo) require
* the file extension to be known beforehand.
*
* This will make the library try to guess the file extension from the file mime type,
* or throw an error if it cannot be guessed.
*/
requireExtension?: boolean
}, },
): Promise<UploadedFile> { ): Promise<UploadedFile> {
// normalize params // normalize params
@ -128,6 +137,7 @@ export async function uploadFile(
if (HAS_FILE && file instanceof File) { if (HAS_FILE && file instanceof File) {
fileName = file.name fileName = file.name
fileSize = file.size fileSize = file.size
fileMime = file.type
file = file.stream() file = file.stream()
} }
@ -309,6 +319,21 @@ export async function uploadFile(
// telegram requires us to specify the file extension // telegram requires us to specify the file extension
const ext = MIME_TO_EXTENSION[fileMime!] const ext = MIME_TO_EXTENSION[fileMime!]
fileName = ext ? `${DEFAULT_FILE_NAME}.${ext}` : DEFAULT_FILE_NAME fileName = ext ? `${DEFAULT_FILE_NAME}.${ext}` : DEFAULT_FILE_NAME
} else if (params.requireExtension) {
const extFromMime = MIME_TO_EXTENSION[fileMime!]
const idx = fileName.lastIndexOf('.')
const extFromName = idx === -1 ? undefined : fileName.slice(idx + 1)
if (!extFromName) {
if (!extFromMime) {
throw new MtArgumentError(`File name does not have an extension, and we cannot guess it from the mime type (${fileMime})`)
}
fileName = `${fileName}.${extFromMime}`
} else if (extFromMime && extFromName !== extFromMime) {
throw new MtArgumentError(`File name has ${extFromName} extension (${fileName}), but the mime type (${fileMime}) expects it to be ${extFromMime}`)
}
} }
let inputFile: tl.TypeInputFile let inputFile: tl.TypeInputFile