অ্যাক্সেস ব্যবহার করে কীভাবে ফাইল ডাউনলোড করবেন


112

আমি জিইটি এবং পোস্টের মতো বেসিক http অনুরোধগুলির জন্য অক্ষর ব্যবহার করছি এবং এটি ভালভাবে কাজ করে। এখন আমারও এক্সেল ফাইলগুলি ডাউনলোড করতে সক্ষম হওয়া দরকার। অক্ষর দিয়ে কি এটা সম্ভব? তা হলে কারও কি কিছু নমুনা কোড রয়েছে? যদি তা না হয় তবে আমি এটির জন্য একটি প্রতিক্রিয়া প্রয়োগে আর কী ব্যবহার করতে পারি?


আমরা এক্সেল ফাইলটি ডাউনলোড করতে এই সমাধানটি ব্যবহার করতে পারি। stackoverflow.com/questions/57127361/…
মোঃ নজরুল ইসলাম

উত্তর:


99

প্রতিক্রিয়া যখন ডাউনলোডযোগ্য ফাইলের সাথে আসে তখন প্রতিক্রিয়া শিরোনামগুলি এমন কিছু হবে

Content-Disposition: "attachment;filename=report.xls"
Content-Type: "application/octet-stream" // or Content-type: "application/vnd.ms-excel"

আপনি যা করতে পারেন তা হল একটি পৃথক উপাদান তৈরি করা, যাতে কোনও লুকানো ইফ্রেমে থাকবে।

  import * as React from 'react';

  var MyIframe = React.createClass({

     render: function() {
         return (
           <div style={{display: 'none'}}>
               <iframe src={this.props.iframeSrc} />
           </div>
         );
     }
  });

এখন, আপনি এই উপাদানটির প্রপ হিসাবে ডাউনলোডযোগ্য ফাইলের ইউআরএল পাস করতে পারেন, সুতরাং যখন এই উপাদানটি প্রপ গ্রহণ করবে, এটি পুনরায় রেন্ডার করবে এবং ফাইলটি ডাউনলোড হবে।

সম্পাদনা: আপনি জেএস-ফাইল-ডাউনলোড মডিউলটিও ব্যবহার করতে পারেন । গিথুব রেপোতে লিঙ্ক

const FileDownload = require('js-file-download');

Axios.get(`http://localhost/downloadFile`)
   .then((response) => {
        FileDownload(response.data, 'report.csv');
   });

আশাকরি এটা সাহায্য করবে :)


4
ধন্যবাদ. এটি যদি আজাক্স স্টাইলে হয় তবে আপনি আমাকে বলতে পারেন। পৃষ্ঠাটি ব্লক না করা ভাল হবে।
ডেভিড চোই

হ্যাঁ, পৃষ্ঠা অবরুদ্ধ করা হবে না। আপনি যখন সেই উপাদানটির প্রপোর হিসাবে url পাস করবেন তখন ফাইলটি স্বয়ংক্রিয়ভাবে ডাউনলোড হবে। আপনার কিছু করার দরকার নেই।
হার্ডিক মোদা

আরেকটি প্রশ্ন. আমার ক্ষেত্রে ডাউনলোড করা ফাইলটি কিছু পরামিতি পাস করার সাথে সাথে গতিশীলভাবে তৈরি করা হয়েছে। সুতরাং এটির সত্যিকার অর্থে কোনও সামঞ্জস্যপূর্ণ অবস্থান নেই। আমি এই জাতীয় দৃশ্যের জন্য যে url প্রেরণ করি তা কী? উদাহরণস্বরূপ যদি আমি axios.post ('api / getmyexcelfile', params) বলি;
ডেভিড চোই

এই উত্তরে উল্লিখিত হিসাবে । অক্ষরেখা প্রতিক্রিয়া অবজেক্টে, অভ্যন্তরের অনুরোধ হিসাবে একটি ক্ষেত্র রয়েছে responseURL, সম্ভবত এটিই আপনি চান URL টি।
হার্ডিক মোদা

4
আমি এটি অনুসরণ করেছি এবং ফাইলটি ডাউনলোড করতে সক্ষম হয়েছি। তবে ফাইলটি ভেঙে গেছে (কাজ করে না)। তবে আমি যদি পুনঃনির্দেশ (উইন্ডো.লোকেশন.ইরেফ) ব্যবহার করি তবে ফাইলটি ডাউনলোড হয় এবং নিখুঁতভাবে কাজ করে। কেউ এই আমাকে দয়া করে সাহায্য করতে পারেন? ( Stackoverflow.com/questions/56306008/... )
Thidasa Pankaja

116

আরও সাধারণ সমাধান

axios({
  url: 'http://api.dev/file-download', //your url
  method: 'GET',
  responseType: 'blob', // important
}).then((response) => {
   const url = window.URL.createObjectURL(new Blob([response.data]));
   const link = document.createElement('a');
   link.href = url;
   link.setAttribute('download', 'file.pdf'); //or any other extension
   document.body.appendChild(link);
   link.click();
});

প্রশ্নগুলি https://gist.github.com/javilobo8/097c30a233786be52070986d8cdb1743 এ দেখুন

সম্পূর্ণ ক্রেডিট: https://gist.github.com/javilobo8


11
সমাধানের জন্য আপনাকে ধন্যবাদ। অন্যের জন্য কেবল কয়েকটি নোট: যদিও এটি ব্যবহারের ক্ষেত্রে প্রচুর পরিমাণে কাজ করতে পারে তবে বড় ফাইল আকারের জন্য আপনি ডাউনলোডের অগ্রগতি দেখতে সক্ষম হবেন না। এবং এটি ব্রাউজারে অতিরিক্ত মেমরি নেবে। অন্যান্য সমাধানগুলিতে যেমন ইঙ্গিত করা হয়েছে, তবে তা বানান নয়, সাধারণ পদ্ধতির শিরোনাম ব্যবহার করা হয় 'বিষয়বস্তু-বিভাজন: সংযুক্তি;' সুতরাং ব্রাউজার এটিকে স্থানীয় ডাউনলোড হিসাবে বিবেচনা করবে (পূর্বোক্ত ডাউনলোড অগ্রগতি + ডিস্কে সরাসরি ডাউনলোড)।
জন লি

সার্ভার সাইডে এমনকি আমি কন্টেন্ট-ডিসপজিশন শিরোনাম সেট করে দিলেও এটি ডাউনলোড অগ্রগতির অনুমতি দেয় বলে মনে হয় না।
হুগি

4
এর জন্য ধন্যবাদ. ফাইলের সামগ্রীটি কেন সঠিকভাবে প্রদর্শিত হচ্ছে না তা ভাবছিল। দেখা যাচ্ছে যে আমি নিখোঁজ ছিলামresponseType: 'blob'
AliAvci

এই ফাইলটি মেমোরির প্রতিক্রিয়া হিসাবে এই ফাইলটি ডাউনলোড করে না (ব্রাউজারটি আসলে ডাউনলোডের অগ্রগতি দেখায় না) কেবল তখনই ফাইলটি মেমরিতে ব্লব হিসাবে ডাউনলোড করা হয় তবে কেবল ব্রাউজার ডাউনলোড ফাইলটিতে এটি সংরক্ষণ করার চেষ্টা করবে ..
রিকি -ইউ

@ রিকি-ইউ হ্যাঁ আপনি ঠিক বলেছেন যে এক্সএইচআর অনুরোধটি প্রেরণ করা হবে এবং প্রতিক্রিয়া এলে এটি মেমরিতে বাফার হবে এবং পরে, responseসম্পূর্ণ হওয়ার পরে পরিবর্তনশীলতে সংরক্ষণ করা হবে । তারপরে createObjectURLএই ডেটাতে একটি স্থানীয় ইউআরএল তৈরি করে যা <a> এ নেভিগেট করতে পারে।
ভিনি

48

ফাইলগুলি ডাউনলোড করা হচ্ছে (অক্ষ এবং সুরক্ষা ব্যবহার করে)

আপনি যখন অ্যাকজিওস এবং সুরক্ষার কিছু উপায় ব্যবহার করে ফাইলগুলি ডাউনলোড করতে চান তখন এটি আসলে আরও জটিল। এটি নির্ণয় করতে অন্য কাউকে অতিরিক্ত সময় ব্যয় করতে বাধা দিতে, আমাকে আপনাকে এখান থেকে চলতে দিন।

আপনার 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();
}

পরিষেবাটি এখন বাইনারি ডকুমেন্টটি বের করে (এক্ষেত্রে একটি এক্সেল প্রতিবেদন), সঠিক সামগ্রীর ধরণ নির্ধারণ করে - এবং দস্তাবেজটি সংরক্ষণ করার সময় প্রস্তাবিত ফাইলের নামযুক্ত একটি কাস্টম এইচটিটিপি শিরোনাম প্রেরণ করে।

৩) প্রাপ্ত দস্তাবেজের জন্য একটি অ্যাক্সিয়ো হ্যান্ডলার প্রয়োগ করুন

এখানে কয়েকটি সমস্যা রয়েছে, সুতরাং আসুন নিশ্চিত হয়ে নিন যে সমস্ত বিবরণ সঠিকভাবে কনফিগার করা হয়েছে:

  1. পরিষেবাটি @ জিইটি (যেমন এইচটিটিপি জিইটি) তে সাড়া দেয়, তাই অক্ষের কলটি অবশ্যই 'অ্যাক্সিয়াস.জেট (...)' হওয়া উচিত।
  2. ডকুমেন্টটি বাইটের স্রোত হিসাবে সঞ্চারিত হয়, সুতরাং আপনাকে প্রতিক্রিয়াটিকে এইচটিএমএল 5 ব্লব হিসাবে বিবেচনা করার জন্য অক্ষর বলতে হবে। (অর্থাত্ প্রতিক্রিয়া টাইপ: 'ব্লব' )।
  3. এই ক্ষেত্রে, ফাইল-সেভার জাভাস্ক্রিপ্ট লাইব্রেরি ব্রাউজার ডায়ালগটি খোলা পপ করতে ব্যবহৃত হয়। যাইহোক, আপনি অন্য চয়ন করতে পারে।

কঙ্কাল অ্যাক্সিয়োস বাস্তবায়ন তখন এর লাইনে কিছু হবে:

 // 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);
    });

19
"ফাইল সেভার" কী?
মেইন পাল

4
এটি ডাউনলোড ফাইলগুলি হ্যান্ডেল করার জন্য একটি গ্রন্থাগার, github.com/eligrey/FileSaver.js/#filesaverjs
Radi

4
এটি কাজ করে তবে এর content-dispositionপরিবর্তে শিরোনাম ব্যবহার করার পরামর্শ দেওয়া হচ্ছে x-suggested-filename
রোসদি কাশিম

12

আইসি এবং অন্যান্য ব্রাউজারগুলির সাথে অ্যাক্সিয়াস.পোস্ট সমাধান

আমি এখানে কিছু অবিশ্বাস্য সমাধান পেয়েছি। তবে তারা প্রায়শই IE ব্রাউজারে সমস্যা বিবেচনা করে না। সম্ভবত এটি অন্য কারও জন্য কিছু সময় সাশ্রয় করবে।

 axios.post("/yourUrl"
                , data,
                {responseType: 'blob'}
            ).then(function (response) {
                    let fileName = response.headers["content-disposition"].split("filename=")[1];
                    if (window.navigator && window.navigator.msSaveOrOpenBlob) { // IE variant
                        window.navigator.msSaveOrOpenBlob(new Blob([response.data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}),
                            fileName);
                    } else {
                        const url = window.URL.createObjectURL(new Blob([response.data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}));
                        const link = document.createElement('a');
                        link.href = url;
                        link.setAttribute('download', response.headers["content-disposition"].split("filename=")[1]);
                        document.body.appendChild(link);
                        link.click();
                    }
                }
            );

উপরের উদাহরণটি এক্সেল ফাইলগুলির জন্য, তবে সামান্য পরিবর্তন সহ যে কোনও ফরমেটে প্রয়োগ করা যেতে পারে।

এবং সার্ভারে আমি এটি করেছি একটি এক্সেল ফাইল প্রেরণ করার জন্য।

response.contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=exceptions.xlsx")

8
        axios.get(
            '/app/export'
        ).then(response => {    
            const url = window.URL.createObjectURL(new Blob([response]));
            const link = document.createElement('a');
            link.href = url;
            const fileName = `${+ new Date()}.csv`// whatever your file name .
            link.setAttribute('download', fileName);
            document.body.appendChild(link);
            link.click();
            link.remove();// you need to remove that elelment which is created before.
})

8

অক্ষর দিয়ে এপিআই কল করার ফাংশন:

  function getFileToDownload (apiUrl) {
     return axios.get(apiUrl, {
       responseType: 'arraybuffer',
       headers: {
         'Content-Type': 'application/json'
       }
     })
  }

ফাংশনটি কল করুন এবং তারপরে আপনার পাওয়া এক্সেল ফাইলটি ডাউনলোড করুন:

getFileToDownload('putApiUrlHere')
  .then (response => {
      const type = response.headers['content-type']
      const blob = new Blob([response.data], { type: type, encoding: 'UTF-8' })
      const link = document.createElement('a')
      link.href = window.URL.createObjectURL(blob)
      link.download = 'file.xlsx'
      link.click()
  })

6

এটি ব্যবহারকারীর জন্য একটি ডাউনলোড ট্রিগার করার জন্য খুব সহজ জাভাস্ক্রিপ্ট কোড:

window.open("<insert URL here>")

আপনি এই অপারেশনের জন্য অক্ষ / অক্ষর চান না; এটি কেবল ব্রাউজারটিকে এটি করতে দেওয়া মানসম্পন্ন হওয়া উচিত।

দ্রষ্টব্য: ডাউনলোডের জন্য যদি আপনার অনুমোদনের প্রয়োজন হয় তবে এটি কাজ নাও করতে পারে। আমি নিশ্চিত যে আপনি কুকিগুলি এই জাতীয় অনুরোধের অনুমোদনের জন্য ব্যবহার করতে পারেন তবে শর্ত থাকে যে এটি একই ডোমেনের মধ্যে রয়েছে তবে নির্বিশেষে, এই ক্ষেত্রে এটি অবিলম্বে কাজ করতে পারে না।


হিসাবে এটি সম্ভব কিনা ... অন্তর্নির্মিত ফাইল ডাউনলোড করার প্রক্রিয়া সহ নয়, না


12
অনুমোদনের শিরোনাম?
এজাজ করিম

আপনার যদি একটি টোকেন প্রেরণের দরকার হয়?
ব্যবহারকারী3808307

আপনি যদি সার্ভারটি নিয়ন্ত্রণ করেন, তবে আপনি কেবল কুকি হিসাবে অ্যাক্সেস টোকেন সংরক্ষণ করতে পারেন এবং ব্রাউজারটি এটি আপনার সার্ভারে কোনও অনুরোধে যুক্ত করবে। medium.com/@ryanchenkie_40935/...
Multihunter

এটি কেবলমাত্র জিইটি হলেই ব্যবহার করা যেতে পারে?
চারিথ জয়সঙ্কা

4
@ চরিতজায়াসঙ্কা হ্যাঁ, আমিও তাই বিশ্বাস করি।
মাল্টিহান্টার

2

কৌশলটি হ'ল একটি অদৃশ্য অ্যাঙ্কর ট্যাগ তৈরি করা render()এবং একটি refঅক্ষর যুক্ত করা যখন আমাদের অ্যাক্সেসের প্রতিক্রিয়া হয় একবার: ক্লিকটি ট্রিগার করার অনুমতি দেয়:

class Example extends Component {
    state = {
        ref: React.createRef()
    }

    exportCSV = () => {
        axios.get(
            '/app/export'
        ).then(response => {
            let blob = new Blob([response.data], {type: 'application/octet-stream'})
            let ref = this.state.ref
            ref.current.href = URL.createObjectURL(blob)
            ref.current.download = 'data.csv'
            ref.current.click()
        })
    }

    render(){
        return(
            <div>
                <a style={{display: 'none'}} href='empty' ref={this.state.ref}>ref</a>
                <button onClick={this.exportCSV}>Export CSV</button>
            </div>
        )
    }
}

এখানে ডকুমেন্টেশনটি রয়েছে: https://reactjs.org/docs/refs-and-the-dom.html । আপনি এখানে অনুরূপ ধারণা পেতে পারেন: https://thewebtier.com/snippets/download-files-with-axios/


-1

অক্ষ অক্ষর পোস্ট অনুরোধের জন্য, অনুরোধটি এরকম কিছু হওয়া উচিত: এখানে মূল কীটি হ'ল responseTypeএবং headerক্ষেত্রগুলি অবশ্যই পোস্টের তৃতীয় প্যারামিটারে থাকতে হবে। ২ য় পরামিতি হ'ল অ্যাপ্লিকেশন পরামিতি।

export const requestDownloadReport = (requestParams) => async dispatch => { 
  let response = null;
  try {
    response = await frontEndApi.post('createPdf', {
      requestParams: requestParams,
    },
    {
      responseType: 'arraybuffer', // important...because we need to convert it to a blob. If we don't specify this, response.data will be the raw data. It cannot be converted to blob directly.
      headers: {
          'Content-Type': 'application/json',
          'Accept': 'application/pdf'
      }
  });          
  }
  catch(err) {
    console.log('[requestDownloadReport][ERROR]', err);
    return err
  }

  return response;
}

-4

আমার উত্তরটি মোট হ্যাক - আমি সবেমাত্র একটি লিঙ্ক তৈরি করেছি যা বোতামের মতো দেখায় এবং এতে ইউআরএল যুক্ত করি।

<a class="el-button"
  style="color: white; background-color: #58B7FF;"
  :href="<YOUR URL ENDPOINT HERE>"
  :download="<FILE NAME NERE>">
<i class="fa fa-file-excel-o"></i>&nbsp;Excel
</a>

আমি অতএব, অদ্ভুত মন্তব্যগুলি চমৎকার VueJs ব্যবহার করছি , তবে এই সমাধানটি ফ্রেমওয়ার্ক অজোনস্টিক। ধারণাটি কোনও HTML ভিত্তিক নকশার জন্য কাজ করবে for

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.