কীভাবে কোনও অবজেক্টের ইউআরএল থেকে ফাইল বা ব্লব পাবেন?


127

আমি ব্যবহারকারীকে একটি পৃষ্ঠায় ছবি ড্র্যাগ এবং ড্রপ এবং অন্যান্য পদ্ধতির মাধ্যমে লোড করতে দিচ্ছি। যখন কোনও চিত্র ফেলে দেওয়া হয়, তখন আমি URL.createObjectURLচিত্রটি প্রদর্শন করতে কোনও অবজেক্ট ইউআরএল রূপান্তর করতে ব্যবহার করছি । আমি ইউআরএলটিকে পুনঃব্যবহার করার মতো করে বাতিল করছি না।

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


পূর্ববর্তী দুটি মন্তব্য সম্পর্কে কিছুই মনে রাখবেন না - XMLHttpRequestআপনাকে কেবল ব্লব ইউআরএল প্রেরণ করতে হবে to
জেংকেভ

2
আসল ফাইল অবজেক্টগুলি কোথাও কেন সংরক্ষণ করবেন না, তবে সেগুলি প্রদর্শন করতে এবং ফর্মটিতে মূল ফাইলগুলি ব্যবহার করার জন্য অবজেক্টের ইউআরএল ব্যবহার করুন?
ব্যবহারকারী 764754

@ ইউজার 646475 user75৪ কারণ ব্যবহারকারীরা আপলোড করা ফাইলটির URL "সি: \ ফ্যাকিপথ" হিসাবে প্রদর্শন করার চেষ্টা করছে
ম্যালকম সালভাদোর

উত্তর:


88

আধুনিক সমাধান:

let blob = await fetch(url).then(r => r.blob());

ইউআরএল একটি অবজেক্ট ইউআরএল বা একটি সাধারণ ইউআরএল হতে পারে।


3
খুশী হলাম। ইএস 5 এর সহজ জিনিসগুলির মতো জিনিসগুলি দেখে আনন্দিত।
ব্রায়ানফ্রেড

11
এবং আপনি যদি প্রতিশ্রুতি থেকে সরাসরি কোনও ফাইল পেতে চান তবে আপনি নীচের মত একটি ফাইল তৈরি করতে পারেন। let file = await fetch(url).then(r => r.blob()).then(blobFile => new File([blobFile], "fileNameGoesHere", { type: "image/png" })
ডিবিকিউ

3
দুর্ভাগ্যক্রমে, ক্রোমে এই সমাধানটি আমার পক্ষে কার্যকর হয় না। ব্রাউজারটি এই URL টি লোড করতে ব্যর্থ।
ওয়ালডিজিস্ট

ওয়ালডিজিস্ট, আপনি কি এটি ক্রিয়েওবজেক্টআরল () এ মুড়ে ফেলেছেন?
ম্যাট ফ্লেচার

73

উপরের মন্তব্যে জ্যাংকেভ ইঙ্গিত করার সাথে সাথে দেখে মনে হচ্ছে এটি করার সর্বোত্তম / একমাত্র উপায় একটি অ্যাসিঙ্ক এক্সএইচআর 2 কল সহ:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'blob:http%3A//your.blob.url.here', true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
  if (this.status == 200) {
    var myBlob = this.response;
    // myBlob is now the blob that the object URL pointed to.
  }
};
xhr.send();

আপডেট (2018): ES5 নিরাপদে ব্যবহার করা যেতে পারে এমন পরিস্থিতিতে, জোয়ের নীচে একটি সহজ ES5- ভিত্তিক উত্তর রয়েছে।


19
আপনার কখন কখন এমন একটি অবজেক্ট ইউআরএল থাকবে যা বর্তমান ডোমেন এবং সুযোগের স্থানীয় নয়?
ব্রায়ানফ্রেড

4
আমি এটি উপরের মতোই করেছি, তবে xhr এর সাথে 404 পাওয়া যায় নি। কি হচ্ছে?
আলবার্ট আপনি

দয়া করে মনে রাখবেন কিছু ব্রাউজার (পড়া পুরাতন ইন্টারনেট ...), যদি আপনি হ্যান্ডেল করতে প্রয়োজন সেই পোস্ট দেখতে যে stackoverflow.com/questions/17657184/...
mraxus

4
@ ব্রায়ানফ্রেড "আপনার কাছে কখন এমন একটি অবজেক্ট ইউআরএল থাকবে যা বর্তমান ডোমেন এবং সুযোগের কাছে স্থানীয় নয়?" আমার ক্ষেত্রে আমি একটি অ্যামাজন এস 3 ব্লবকে একটি আলাদা ফাইলের নাম দেওয়ার চেষ্টা করছি, এটি বর্তমানে এক্সটেনশন ছাড়াই এস 3 এর একটি "গাইড"। সুতরাং, আমার ক্ষেত্রে আমি ক্রস-ডোমেন কলটি ব্যবহার করছি।
ওয়াগনার বার্টোলিনি জুনিয়র

6
"অবজেক্ট ইউআরএল হ'ল ইউআরএল যা ডিস্কের ফাইলগুলিতে নির্দেশ করে" " সংজ্ঞা অনুসারে অবজেক্ট URL গুলি কেবল স্থানীয় হতে পারে।
ব্রায়ানফ্রেড

12

প্রতিক্রিয়া / নোড / অ্যাক্সিয়োসের সাথে কাজ করার সময় হয়ত কেউ এই দরকারী বলে মনে করেন। আমি react-dropzoneএটি ইউআই সহ আমার ক্লাউডাইনারি চিত্র আপলোড বৈশিষ্ট্যের জন্য ব্যবহার করেছি ।

    axios({
        method: 'get',
        url: file[0].preview, // blob url eg. blob:http://127.0.0.1:8000/e89c5d87-a634-4540-974c-30dc476825cc
        responseType: 'blob'
    }).then(function(response){
         var reader = new FileReader();
         reader.readAsDataURL(response.data); 
         reader.onloadend = function() {
             var base64data = reader.result;
             self.props.onMainImageDrop(base64data)
         }

    })

1
এই ক্রস ডোমেন অনুরোধের জন্য কাজ করে? টুইটার ভিডিওতে ব্লব ইউআরএল রয়েছে। ব্লব ইউআরএল নির্দেশ করছে যে ব্লব অবজেক্টটি সংগ্রহ করতে আমার সক্ষম হওয়া দরকার। আমি ব্রাউজারে এপিআই আনছি, যা আমাকে এই ত্রুটি দিচ্ছে - Refused to connect to 'blob:https://twitter.com/9e00aec3-6729-42fb-b5a7-01f50be302fa' because it violates the following Content Security Policy directive: "connect-src । আপনি কি ইঙ্গিত দিতে পারেন আমি কী ভুল করছি / পাচ্ছি না?
জিডিএড্রাইভার

আমি ব্লকটির সাথে ডেটা সম্পত্তি হিসাবে ফলাফলটি পেতে এই ওয়ান-লাইনারটি ব্যবহার করতে সক্ষম হয়েছি: কনস্ট রেজাল্ট = অ্যাকজিস্টস অজটি.র (ইউআরএল, {রেসপন্স টাইপ: "ব্লব"});
নোয়া স্টাহল

4

এক্সএইচআর অনুরোধ থেকে বিএলএলওবা প্রাপ্তি দেখুন দেখুন যা উল্লেখ করে যে ব্লববিল্ডার ক্রোমে কাজ করে না তাই আপনার ব্যবহারের প্রয়োজন:

xhr.responseType = 'arraybuffer';

4

নীচের মত উদাহরণস্বরূপ আনতে ব্যবহার করুন:

 fetch(<"yoururl">, {
    method: 'GET',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + <your access token if need>
    },
       })
.then((response) => response.blob())
.then((blob) => {
// 2. Create blob link to download
 const url = window.URL.createObjectURL(new Blob([blob]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', `sample.xlsx`);
 // 3. Append to html page
 document.body.appendChild(link);
 // 4. Force download
 link.click();
 // 5. Clean up and remove the link
 link.parentNode.removeChild(link);
})

আপনি পরীক্ষার জন্য Chrome কনসোলে পেস্ট করতে পারেন। 'নমুনা.এক্সলসেক্স' ডাউনলোডের সাথে ফাইল আশা করি এটি সাহায্য করতে পারে!


আমি মনে করি যে ওপি আশেপাশের অন্য উপায়ের চেয়ে কোনও ব্লব ইউআরএলকে আসল ফাইল / ব্লাবে রূপান্তরিত করার বিষয়ে বলেছিল।
অভিষেক ঘোষ

3

দুর্ভাগ্যক্রমে @ ব্রায়ানফ্রেডের উত্তর আমার প্রয়োজনের সাথে খাপ খায় না, আমার কিছুটা আলাদা প্রয়োজন ছিল, এবং আমি জানি এটি @ ব্রায়ানফ্রেডের প্রশ্নের উত্তর নয়, তবে আমি এটি এখানে রেখে চলেছি কারণ প্রচুর লোক আমার প্রয়োজন অনুসারে এখানে এসেছিল। 'ইউআরএল থেকে ফাইল বা ব্লব কীভাবে পাওয়া যায়?' এর মতো আমার কিছু দরকার ছিল এবং বর্তমান সঠিক উত্তরটি আমার প্রয়োজনের সাথে খাপ খায় না কারণ এটি ক্রস-ডোমেন নয়।

আমার একটি ওয়েবসাইট রয়েছে যা একটি অ্যামাজন এস 3 / অ্যাজুরি স্টোরেজ থেকে চিত্র গ্রহণ করে এবং সেখানে আমি অনন্য আইডিয়াফায়ারগুলির সাথে নামযুক্ত জিনিসগুলি সঞ্চয় করি:

নমুনা: HTTP: //****.blob.core.windows.net/systemimages/bf142dc9-0185-4aee-a3f4-1e5e95a09bcf

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

কাজ করা সম্ভব যে, আমি হেনরি Algus থেকে এই মহান নিবন্ধ ব্যবহার করেছেন: http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/

1. প্রথম পদক্ষেপ: jquery বাইনারি সমর্থন যুক্ত করুন

/**
*
* jquery.binarytransport.js
*
* @description. jQuery ajax transport for making binary data type requests.
* @version 1.0 
* @author Henry Algus <henryalgus@gmail.com>
*
*/

// use this transport for "binary" data type
$.ajaxTransport("+binary", function (options, originalOptions, jqXHR) {
    // check for conditions and support for blob / arraybuffer response type
    if (window.FormData && ((options.dataType && (options.dataType == 'binary')) || (options.data && ((window.ArrayBuffer && options.data instanceof ArrayBuffer) || (window.Blob && options.data instanceof Blob))))) {
        return {
            // create new XMLHttpRequest
            send: function (headers, callback) {
                // setup all variables
                var xhr = new XMLHttpRequest(),
        url = options.url,
        type = options.type,
        async = options.async || true,
        // blob or arraybuffer. Default is blob
        dataType = options.responseType || "blob",
        data = options.data || null,
        username = options.username || null,
        password = options.password || null;

                xhr.addEventListener('load', function () {
                    var data = {};
                    data[options.dataType] = xhr.response;
                    // make callback and send data
                    callback(xhr.status, xhr.statusText, data, xhr.getAllResponseHeaders());
                });

                xhr.open(type, url, async, username, password);

                // setup custom headers
                for (var i in headers) {
                    xhr.setRequestHeader(i, headers[i]);
                }

                xhr.responseType = dataType;
                xhr.send(data);
            },
            abort: function () {
                jqXHR.abort();
            }
        };
    }
});

২. দ্বিতীয় পদক্ষেপ: এই পরিবহণের ধরণটি ব্যবহার করে একটি অনুরোধ করুন।

function downloadArt(url)
{
    $.ajax(url, {
        dataType: "binary",
        processData: false
    }).done(function (data) {
        // just my logic to name/create files
        var filename = url.substr(url.lastIndexOf('/') + 1) + '.png';
        var blob = new Blob([data], { type: 'image/png' });

        saveAs(blob, filename);
    });
}

এখন আপনি তৈরি ব্লবটি যেমন আপনি চান তা ব্যবহার করতে পারেন, আমার ক্ষেত্রে আমি এটি ডিস্কে সংরক্ষণ করতে চাই।

৩. alচ্ছিক: ফাইলসভার ব্যবহার করে ব্যবহারকারীর কম্পিউটারে ফাইল সংরক্ষণ করুন

ডাউনলোড করা ফাইলটি ডিস্কে সংরক্ষণ করতে আমি ফাইলসভার.জেএস ব্যবহার করেছি, যদি আপনার এটি সম্পাদন করতে হয় তবে দয়া করে এই জাভাস্ক্রিপ্ট লাইব্রেরিটি ব্যবহার করুন:

https://github.com/eligrey/FileSaver.js/

আমি আশা করি এটি আরও নির্দিষ্ট প্রয়োজনীয়তার সাথে অন্যদের সহায়তা করবে help


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

1
@ ব্রায়ানফ্রেড আমি পেয়েছি যা ঠিক এই প্রশ্নের উত্তর নয়। তবে আমি এখনও মনে করি যে এটি ছেড়ে দেওয়ার একটি উত্তম উত্তর, যেহেতু আমি এখানে এসেছি একটু ভিন্ন প্রশ্নের উত্তর 'কীভাবে একটি URL থেকে ফাইল বা ব্লব পাবেন?' যদি আপনি নিজের উত্তরটি পরীক্ষা করেন তবে 10 টি আপগেট রয়েছে 'ক্রস ডোমেন অনুরোধের ক্ষেত্রে এটি কাজ করে না। '। সুতরাং এটির জন্য 10 জনেরও বেশি ব্যক্তি এখানে এসেছিলেন। আমি স্থির করেছিলাম তবে এখানেই রেখে দেব।
ওয়াগনার বার্টোলিনি জুনিয়র

সমস্যাটি হ'ল, আপনার উত্তরটি জেনেশুনে এই প্রশ্নের উত্তর দেয় না। একটি সাধারণ URL এবং একটি অবজেক্ট ইউআরএল দুটি সম্পূর্ণ ভিন্ন জিনিস। "ক্রস ডোমেন অনুরোধগুলির ক্ষেত্রে এটি কার্যকর হয় না" - এর উপরে আপোভের # সম্পর্কিত বিষয়ে, আপনি কি এখানে কেন আক্ষরিক অসম্ভব এটি তার চেয়ে বেশি ভাল ব্যাখ্যা করবেন না এবং সাধারণ URL গুলির উত্তর প্রদর্শন করার মতো কোনও জায়গায় নির্দেশ করতে চাইবেন কি না? এখানে সাধারণ ইউআরএল এবং অবজেক্ট ইউআরএলকে বিভ্রান্ত করে জিনিসগুলিকে বিভ্রান্ত করার চেয়ে?
ব্রায়ানফ্রেড

@ ব্রায়ান ফ্রেড আমার উত্তরের একটি সম্পাদনা পরামর্শ দিতে নির্দ্বিধায় আমি বিষয়টি নিয়ে অধ্যয়ন করব, সম্ভবত আমি ভুল বুঝেছি একটি "অবজেক্ট ইউআরএল" বনাম একটি "অবজেক্ট ইউআরএল" ... ইংরেজি আমার নেটিভ নয়। আমি আরও ভাল উত্তর দিতে বিষয়টি নিয়ে একটি গবেষণা করব। তবে আমি মনে করি এটি অন্যরা যারা এখানে এসেছেন অন্যরকম কিছু খুঁজছেন। এখানে আসার জন্য আমি "অবজেক্ট ইউআরএল" অনুসন্ধান করিনি, এটি আমার আগে বক্তব্য ছিল। তবে আমি আপনাকে পেয়েছি।
ওয়াগনার বার্টোলিনি জুনিয়র

2

আপনি যদি কোনওভাবে ক্যানভাসে ফাইলটি দেখান তবে আপনি ক্যানভাসের সামগ্রীকে একটি ব্লব অবজেক্টে রূপান্তর করতে পারেন।

canvas.toBlob(function(my_file){
  //.toBlob is only implemented in > FF18 but there is a polyfill 
  //for other browsers https://github.com/blueimp/JavaScript-Canvas-to-Blob
  var myBlob = (my_file);
})

2
মনে রাখবেন যে এটি আপনাকে একই মূল ফাইলটি ফিরিয়ে দিচ্ছে না ; এটি ফ্লাইতে একটি নতুন চিত্র ফাইল তৈরি করছে। কয়েক বছর আগে যখন আমি শেষবার পরীক্ষা করেছি, তখন আমি জানতে পেরেছিলাম যে কমপক্ষে ক্রোমে, নতুন চিত্র ফাইলটি কোনওভাবেই সংকুচিত হয় না - আমার কাছে 10 কে জেপিংস 2.5 এমবি জেপিজেজে রূপান্তরিত হয়েছিল।
ব্রায়ানফ্রেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.