ফাইলগুলি ডাউনলোড করা হচ্ছে (অক্ষ এবং সুরক্ষা ব্যবহার করে)
আপনি যখন অ্যাকজিওস এবং সুরক্ষার কিছু উপায় ব্যবহার করে ফাইলগুলি ডাউনলোড করতে চান তখন এটি আসলে আরও জটিল। এটি নির্ণয় করতে অন্য কাউকে অতিরিক্ত সময় ব্যয় করতে বাধা দিতে, আমাকে আপনাকে এখান থেকে চলতে দিন।
আপনার 3 টি জিনিস করা দরকার:
1. Configure your server to permit the browser to see required HTTP headers
2. Implement the server-side service, and making it advertise the correct file type for the downloaded file.
3. Implementing an Axios handler to trigger a FileDownload dialog within the browser
এই পদক্ষেপগুলি বেশিরভাগ ক্ষেত্রেই করণীয় - তবে ব্রাউজারের সিওআরএসের সম্পর্কের দ্বারা যথেষ্ট জটিল। একটি সময়ে এক ধাপ:
1. আপনার (HTTP) সার্ভারটি কনফিগার করুন
পরিবহন সুরক্ষা নিয়োগ করার সময়, ব্রাউজারের মধ্যে কার্যকর জাভাস্ক্রিপ্ট HTTP সার্ভারের দ্বারা প্রেরিত HTTP শিরোনামগুলির মধ্যে কেবল 6 টিরই [ডিজাইন দ্বারা] অ্যাক্সেস করতে পারে। যদি আমরা সার্ভারটি ডাউনলোডের জন্য কোনও ফাইলের নাম প্রস্তাব করতে চাই, তবে আমাদের অবশ্যই ব্রাউজারকে জানাতে হবে যে জাভাস্ক্রিপ্টের জন্য অন্যান্য হেডারগুলিতে অ্যাক্সেস দেওয়া উচিত যেখানে প্রস্তাবিত ফাইলের নাম স্থানান্তরিত হবে।
আসুন আমরা আলোচনার খাতিরে ধরে নিতে পারি - আমরা চাই যে সার্ভারটি একটি প্রস্তাবিত ফাইলের নামটি একটি এইচটিটিপি শিরোনামের মধ্যে এক্স-প্রস্তাবিত-ফাইলের নামান্তরিত করে । এইচটিটিপি সার্ভারটি ব্রাউজারকে জানায় যে এই প্রাপ্ত কাস্টম শিরোনামটি নিম্নলিখিত শিরোনাম সহ জাভাস্ক্রিপ্ট / অ্যাক্সিয়াসে প্রকাশ করা ঠিক আছে:
Access-Control-Expose-Headers: X-Suggested-Filename
এই শিরোনামটি সেট করতে আপনার এইচটিটিপি সার্ভারটি কনফিগার করার সঠিক উপায়টি পণ্য থেকে পরিবর্তিত হয়।
এই স্ট্যান্ডার্ড শিরোনামগুলির পুরো ব্যাখ্যা এবং বিশদ বিবরণের জন্য https://developer.mozilla.org/en-US/docs/Web/HTTP/Heeda/Access-Control-Expose-Heilers দেখুন ।
২. সার্ভার-সাইড পরিষেবাটি কার্যকর করুন
আপনার সার্ভার-সাইড পরিষেবা প্রয়োগের জন্য এখন অবশ্যই 2 টি জিনিস সম্পাদন করা উচিত:
1. Create the (binary) document and assign correct ContentType to the response
2. Assign the custom header (X-Suggested-Filename) containing the suggested file name for the client
আপনার নির্বাচিত প্রযুক্তি স্ট্যাকের উপর নির্ভর করে এটি বিভিন্ন উপায়ে করা হয়। আমি জাভাউই 7 মান ব্যবহার করে একটি উদাহরণ স্কেচ করব যা একটি এক্সেল রিপোর্ট প্রকাশ করবে:
@GET
@Path("/report/excel")
@Produces("application/vnd.ms-excel")
public Response getAllergyAndPreferencesReport() {
// Create the document which should be downloaded
final byte[] theDocumentData = ....
// Define a suggested filename
final String filename = ...
// Create the JAXRS response
// Don't forget to include the filename in 2 HTTP headers:
//
// a) The standard 'Content-Disposition' one, and
// b) The custom 'X-Suggested-Filename'
//
final Response.ResponseBuilder builder = Response.ok(
theDocumentData, "application/vnd.ms-excel")
.header("X-Suggested-Filename", fileName);
builder.header("Content-Disposition", "attachment; filename=" + fileName);
// All Done.
return builder.build();
}
পরিষেবাটি এখন বাইনারি ডকুমেন্টটি বের করে (এক্ষেত্রে একটি এক্সেল প্রতিবেদন), সঠিক সামগ্রীর ধরণ নির্ধারণ করে - এবং দস্তাবেজটি সংরক্ষণ করার সময় প্রস্তাবিত ফাইলের নামযুক্ত একটি কাস্টম এইচটিটিপি শিরোনাম প্রেরণ করে।
৩) প্রাপ্ত দস্তাবেজের জন্য একটি অ্যাক্সিয়ো হ্যান্ডলার প্রয়োগ করুন
এখানে কয়েকটি সমস্যা রয়েছে, সুতরাং আসুন নিশ্চিত হয়ে নিন যে সমস্ত বিবরণ সঠিকভাবে কনফিগার করা হয়েছে:
- পরিষেবাটি @ জিইটি (যেমন এইচটিটিপি জিইটি) তে সাড়া দেয়, তাই অক্ষের কলটি অবশ্যই 'অ্যাক্সিয়াস.জেট (...)' হওয়া উচিত।
- ডকুমেন্টটি বাইটের স্রোত হিসাবে সঞ্চারিত হয়, সুতরাং আপনাকে প্রতিক্রিয়াটিকে এইচটিএমএল 5 ব্লব হিসাবে বিবেচনা করার জন্য অক্ষর বলতে হবে। (অর্থাত্ প্রতিক্রিয়া টাইপ: 'ব্লব' )।
- এই ক্ষেত্রে, ফাইল-সেভার জাভাস্ক্রিপ্ট লাইব্রেরি ব্রাউজার ডায়ালগটি খোলা পপ করতে ব্যবহৃত হয়। যাইহোক, আপনি অন্য চয়ন করতে পারে।
কঙ্কাল অ্যাক্সিয়োস বাস্তবায়ন তখন এর লাইনে কিছু হবে:
// Fetch the dynamically generated excel document from the server.
axios.get(resource, {responseType: 'blob'}).then((response) => {
// Log somewhat to show that the browser actually exposes the custom HTTP header
const fileNameHeader = "x-suggested-filename";
const suggestedFileName = response.headers[fileNameHeader];'
const effectiveFileName = (suggestedFileName === undefined
? "allergierOchPreferenser.xls"
: suggestedFileName);
console.log("Received header [" + fileNameHeader + "]: " + suggestedFileName
+ ", effective fileName: " + effectiveFileName);
// Let the user save the file.
FileSaver.saveAs(response.data, effectiveFileName);
}).catch((response) => {
console.error("Could not Download the Excel report from the backend.", response);
});