Jedno podejście byłoby wykonać żądania HEAD
przed ustawieniem .download
własnością <a>
elementu określić Content-Type
żądanego zasobu, należy użyć JSON
ciąg, obiekt JavaScript lub innego klawisza, format przechowywania danych para wartości, aby odzwierciedlić par ważny MIME
typy dla prawidłowych rozszerzeń plików odpowiadających właściwości typu MIME
. Użyj metody: .indexOf()
, lub innej metody filtrowania w celu ustalenia, czy istnieje zgodność między nazwą właściwości ciągu lub obiektu a wartością właściwości, jeśli true, zapisz wartość rozszerzenia i połącz rozszerzenie z sugerowaną nazwą pliku.
Jeśli plik nie jest podawany z nagłówkami Cors można spróbować przy użyciu serwera proxy, aby HEAD
z GET
prośba, aby uzyskać nagłówek Content-Type
przed ustawienie atrybutu .download
.
Należy zauważyć, że atrybut .download
jest tylko sugestią użytkownika dla nazwy pliku. Użytkownik może zmienić nazwę pliku w dowolnym czasie, w tym usunąć rozszerzenie pliku, z dowolnego powodu, który może mieć lub nie. Lub nie pobieraj zasobu w ogóle.
const mimeTypeExtensions = {
"text/plain": ".txt",
"video/mp4": ".mp4",
/* valid MIME types and corresponding extensions */
}
const a = document.querySelector("a");
a.addEventListener("click", event => {
if (!a.download) {
event.preventDefault();
fetch(a.href, {method: "HEAD"})
.then(response => {
const mimeType = response.headers.get("content-type");
let fileExtension = "";
for (let [key, prop] of Object.entries(mimeTypeExtensions)) {
if (key.indexOf(mimeType) > -1) {
fileExtension = prop;
break;
};
}
a.download = `filename${fileExtension}`;
a.click();
})
.catch(err => console.error(err))
}
});
<a href="https://gist.githubusercontent.com/guest271314/11edc4566ba94f204dd46e6ae26edaad/raw/d118e99abbe2a2c60634e46816df9e1b9de6b6b8/D134213BA9465CB74DFD36CDE47BF102638C4A9F3ACA357F79EE747DD5F49F1E0F0DE">click</a>
W jaki sposób pozyskujesz pliki? – TheChetan
@ TheChetan pobieranie ich z Internetu za pośrednictwem przeglądarki – Anthony
@Anthony Czy pliki są obsługiwane z nagłówkami 'CORS'? – guest271314