2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
<a href="链接" >下载</a>
Tiedostolinkki (yleensä palvelimella oleva tiedosto Tämä linkki syötetään yleensä osoitepalkkiin esikatselua varten, ei liitteen lataamista varten).
Jos haluat muuttaa sen liitetiedostoksi, voit valita jommankumman seuraavista kahdesta menetelmästä:
1. Taustakäsittely, lisää taustaan vastausotsikko
res.setHeader('Content-Dispostion', 'attachment', 'name.pdf')
2. Lisää latausattribuutti a-tunnisteeseen
<a href="链接" download="文件名" >下载</a>
Haitat: Käytettäessä tunnistetta JavaScript-tiedoston lataamiseen, selaimen lataus käynnistyy suoraan tagin napsautustapahtuman kautta, eikä pyynnön otsikkoa voi asettaa, koska tämä on yksinkertainen GET-pyyntö. Jos tämän tiedoston lataaminen edellyttää tunnuksen kuljettamista, tunniste ei ole tehokas (tunniste ei voi kuljettaa merkkiä) ja siitä tulee esikatselu.
Ratkaisu: Tunniste voi sisältää evästeitä, joten ennen tiedoston lataamista lähetä pyyntö tilapäisen tunnuksen hankkimiseksi ja siirrä se evästeen kautta kuten juokseva vesi Tallennetaan paikalliselle levylle, joten lataus näkyy suoraan eikä tiedostoa tallenneta selaimen välimuistiin.
Kirjoita lataustapa (käytä silti lataukseen tunnistetta)
Tämä menetelmä voi olla ajax-pyyntö, joka voi sisältää tunnuksen ja muuntaa sitten pyydetyn palvelintiedoston blobiksi, luoda tunnisteen ladattavaksi, luoda virtuaalisen linkkielementin ja simuloida latausnapsautusta. Tämä menetelmä vie etupään langan.
import fetch from 'isomorphic-fetch';
const exportFile = (url, options) => {
const projectId = sessionStorage.getItem(PROJECT_ID);
const downLoadURL = projectId ? BATCH_ACTION_URL_PREFIX.V2 : BATCH_ACTION_URL_PREFIX.V1;
const defaultOptions = {
credentials: 'same-origin',
};
const newOptions = { ...defaultOptions, ...options };
if (
newOptions.method === 'POST' ||
newOptions.method === 'PUT' ||
newOptions.method === 'DELETE'
) {
const projectId = sessionStorage.getItem(PROJECT_ID);
const appId = sessionStorage.getItem(APP_ID);
const shopId = sessionStorage.getItem(SHOP_ID);
const params = {};
projectId && Object.assign(params, { projectId });
appId && Object.assign(params, { appId });
shopId && Object.assign(params, { shopId });
newOptions.body = { ...newOptions.body, ...params };
if (!(newOptions.body instanceof FormData)) {
newOptions.headers = {
Accept: 'application/json',
'Content-Type': 'application/json; charset=utf-8',
...newOptions.headers,
};
} else {
// newOptions.body is FormData
newOptions.headers = {
Accept: 'application/json',
...newOptions.headers,
};
}
}
const token = window.localStorage.getItem(TOKEN);
if (token) {
newOptions.headers = {
'X-Authorization': `Bearer ${token}`,
...newOptions.headers,
};
}
const lang = localStorage.getItem(LOCALE_KEY);
if (lang) {
newOptions.headers = {
'Accept-Language': lang,
...newOptions.headers,
};
}
const requestURL = `${downLoadURL}/${url}`;
return request(requestURL, newOptions).then(res => {
let filename;
if (res.headers) {
filename = (
res.headers.get('Content-Disposition') || res.headers.get('content-disposition')
).split('attachment;filename=')[1];
}
if (res.blob) {
res.blob().then(blob => {
var alink = document.createElement('a');
alink.style.display = 'none';
alink.target = '_blank';
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
// 兼容IE/Edge
window.navigator.msSaveOrOpenBlob(blob, filename);
} else {
alink.href = window.URL.createObjectURL(blob);
alink.download = filename;
}
document.body.appendChild(alink);
alink.click();
URL.revokeObjectURL(alink.href); // 释放URL 对象
document.body.removeChild(alink);
});
return res;
} else {
if (res.code === 0) {
return res;
} else {
message.warning(res.message);
}
}
});
};
export default exportFile;
export default function request(url: string, options: Object) {
const defaultOptions = {
credentials: 'same-origin',
};
const newOptions = { ...defaultOptions, ...options };
if (
newOptions.method === 'POST' ||
newOptions.method === 'PUT' ||
newOptions.method === 'DELETE' ||
newOptions.method === 'PATCH'
) {
if (!(newOptions.body instanceof FormData)) {
newOptions.headers = {
Accept: 'application/json',
'Content-Type': 'application/json; charset=utf-8',
...newOptions.headers,
};
newOptions.body = JSON.stringify(newOptions.body);
} else {
// newOptions.body is FormData
newOptions.headers = {
Accept: 'application/json',
...newOptions.headers,
};
}
}
return fetch(url, newOptions).then(response => checkStatus(response, url, options));
}
**Jos tiedosto on pieni, se on hyvä, napsauta ladataksesi, mutta lataus tulee näkyviin muutaman minuutin kuluttua palvelinpuolen blobiksi (res.blob () Kesti hyvin kauan), ennen kuin a-tunnisteen suoratoistolataus suoritettiin (vain täällä interaktiivinen heijastus lataamisesta alkoi näkyä sivulla)