2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
<a href="链接" >下载</a>
सञ्चिकालिङ्क् (प्रायः सर्वरे सञ्चिका) एतत् लिङ्क् सामान्यतया पूर्वावलोकनार्थं पतापट्टिकायां प्रविष्टं भवति, न तु संलग्नकं अवतरणं कर्तुं ।
यदि भवान् तत् संलग्नक-अवलोकनरूपेण परिवर्तयितुम् इच्छति तर्हि निम्नलिखितयोः पद्धतियोः एकं चिन्वतु ।
1. Backend processing, backend मध्ये प्रतिक्रियाशीर्षकं योजयन्तु
res.setHeader('Content-Dispostion', 'attachment', 'name.pdf')
2. a टैग् मध्ये download एट्रिब्यूट् योजयन्तु
<a href="链接" download="文件名" >下载</a>
दोषाः: जावास्क्रिप्ट् मध्ये सञ्चिकां डाउनलोड् कर्तुं a टैग् इत्यस्य उपयोगं कुर्वन्, ब्राउजर् डाउनलोड् प्रत्यक्षतया a टैग् इत्यस्य क्लिक् इवेण्ट् इत्यस्य माध्यमेन प्रवर्तते, अनुरोधशीर्षकं च सेट् कर्तुं न शक्यते यतोहि एषः सरलः GET अनुरोधः अस्ति यदि अस्याः सञ्चिकायाः डाउनलोड् कृते टोकनं वहितुं आवश्यकं भवति तर्हि a टैग् प्रभावी न भविष्यति (a टैग् टोकनं वहितुं न शक्नोति) पूर्वावलोकनं च भविष्यति ।
समाधानम् : a टैग् कुकीजं वहितुं शक्नोति, अतः सञ्चिकायाः डाउनलोड् करणात् पूर्वं अस्थायी टोकनं प्राप्तुं अनुरोधं प्रेषयन्तु तथा च कुकीजस्य माध्यमेन वहन्तु इति स्ट्रीमिंग डाउनलोड् अस्ति, यत् सर्वरस्य सञ्चिकाः निर्मास्यति यथा प्रवाहितजलं स्थानीयडिस्कमध्ये संगृहीतम्, अतः डाउनलोड् प्रत्यक्षतया द्रष्टुं शक्यते तथा च सञ्चिका ब्राउजर् मध्ये न सञ्चिता भविष्यति ।
डाउनलोड् कर्तुं एकं विधिं लिखन्तु (मूलतः अद्यापि डाउनलोड् कर्तुं a tag इत्यस्य उपयोगं कुर्वन्तु)
इयं पद्धतिः ajax अनुरोधः भवितुम् अर्हति, यः टोकनं वहितुं शक्नोति, ततः अनुरोधितं सर्वरसञ्चिकां blob मध्ये परिवर्तयितुं, डाउनलोड् कृते a टैग् निर्मातुम्, वर्चुअल् लिङ्क् तत्वं निर्मातुम्, डाउनलोड् कर्तुं क्लिक् अनुकरणं कर्तुं च शक्नोति एषा पद्धतिः अग्रे-अन्त-सूत्रं गृह्णीयात् ।
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));
}
**यदि सञ्चिका लघु अस्ति तर्हि साधु अस्ति यदि सञ्चिका बृहत् अस्ति तर्हि भवन्तः डाउनलोड् कर्तुं क्लिक् करिष्यन्ति, परन्तु डाउनलोड् कतिपयेषु निमेषेषु अनन्तरं दृश्यते server side into a blob (res.blob () It took a very long time) before the streaming download of the a tag (केवलम् अत्र डाउनलोड् करणस्य अन्तरक्रियाशीलं प्रतिबिम्बं पृष्ठे प्रकटितुं आरब्धम्)