ব্লব থেকে অ্যারেবফারে কীভাবে যাবেন


110

আমি ব্লবগুলি অধ্যয়ন করছিলাম এবং আমি লক্ষ্য করেছি যে আপনার যখন অ্যারেবফার থাকে আপনি সহজেই এটিকে একটি ব্লাবে রূপান্তর করতে পারেন নীচের হিসাবে:

var dataView = new DataView(arrayBuffer);
var blob = new Blob([dataView], { type: mimeString });

আমার এখন প্রশ্নটি হ'ল, কোনও ব্লব থেকে অ্যারেবফারে যাওয়া কি সম্ভব?


2
ব্লবগুলি দেশীয় জেএস ফর্ম্যাটে নেই। এগুলি তথ্য সম্পর্কিত তথ্যগুলির মতো তবে প্রকৃত ডেটা নয়। এর থেকে ডেটা Blobসরাসরি পড়া যায় না তবে এটি কিছু এপিআই দিয়ে করা যেতে পারে।
ট্রিপলস

উত্তর:


39

Responseএপিআই হ্রাস একটি (অপরিবর্তনীয়) Blobযা থেকে তথ্য বিভিন্নভাবে উদ্ধার করা যেতে পারে। ওপি শুধুমাত্র জন্য জিজ্ঞাসা ArrayBuffer, এবং এখানে এটি একটি বিক্ষোভের আছে।

var blob = GetABlobSomehow();

// NOTE: you will need to wrap this up in a async block first.
/* Use the await keyword to wait for the Promise to resolve */
await new Response(blob).arrayBuffer();   //=> <ArrayBuffer>

বিকল্পভাবে আপনি এটি ব্যবহার করতে পারেন:

new Response(blob).arrayBuffer()
.then(/* <function> */);

দ্রষ্টব্য: এই API টি পুরানো ( প্রাচীন ) ব্রাউজারগুলির সাথে সামঞ্জস্যপূর্ণ নয় তাই নিরাপদ দিকে থাকার জন্য ব্রাউজারের সামঞ্জস্যতা সারণীতে একবার দেখুন ;)


1
এটি শীর্ষ উত্তর আইএমও হওয়া উচিত।
ক্যামেরন মার্টিন

কনস্ট অ্যারেবফার = অপেক্ষা করুন নতুন রেসপন্স (ব্লব) .arrayBuffer ();
আর.চ্যা

1
@ আর সিচা ঠিক করার জন্য ধন্যবাদ। আমি তা খেয়াল করিনি!
ট্রিপলস

2
চতুর কৌতুক এবং বিভ্রান্ত হওয়ার দরকার নেই Blob.arrayBuffer()যার সাথে আসলে ২০২০ সালেও যথেষ্ট দুর্বল সামঞ্জস্যতা রয়েছে, ক্যানিউজ :: # feat=mdn-api_blob_arraybuffer বা developer.mozilla.org/en-US/docs/Web/API/Blob/arrayBuffer
jpschroeder

এর পারফরম্যান্স কী? এটি ব্লাবে ডেটা অনুলিপি করে বা এটির কোনও দৃশ্য ফিরে আসে?
গ্যারিও

141

আপনি FileReaderএটি Blobহিসাবে পড়তে ব্যবহার করতে পারেন ArrayBuffer

একটি সংক্ষিপ্ত উদাহরণ এখানে:

var arrayBuffer;
var fileReader = new FileReader();
fileReader.onload = function(event) {
    arrayBuffer = event.target.result;
};
fileReader.readAsArrayBuffer(blob);

এখানে একটি দীর্ঘ উদাহরণ:

// ArrayBuffer -> Blob
var uint8Array  = new Uint8Array([1, 2, 3]);
var arrayBuffer = uint8Array.buffer;
var blob        = new Blob([arrayBuffer]);

// Blob -> ArrayBuffer
var uint8ArrayNew  = null;
var arrayBufferNew = null;
var fileReader     = new FileReader();
fileReader.onload  = function(event) {
    arrayBufferNew = event.target.result;
    uint8ArrayNew  = new Uint8Array(arrayBufferNew);

    // warn if read values are not the same as the original values
    // arrayEqual from: http://stackoverflow.com/questions/3115982/how-to-check-javascript-array-equals
    function arrayEqual(a, b) { return !(a<b || b<a); };
    if (arrayBufferNew.byteLength !== arrayBuffer.byteLength) // should be 3
        console.warn("ArrayBuffer byteLength does not match");
    if (arrayEqual(uint8ArrayNew, uint8Array) !== true) // should be [1,2,3]
        console.warn("Uint8Array does not match");
};
fileReader.readAsArrayBuffer(blob);
fileReader.result; // also accessible this way once the blob has been read

এটি ক্রোম 27—69, ফায়ারফক্স 20-60 এবং সাফারি 6-10 এর কনসোলে পরীক্ষিত হয়েছিল।

আপনি এখানে খেলতে পারেন এমন একটি সরাসরি প্রদর্শন এখানেও রয়েছে: https://jsfiddle.net/potatosalad/FbaM6/

আপডেট 2018-06-23:event.target.result বনাম সম্পর্কে টিপস জন্য ক্লাউস ক্লিন ধন্যবাদthis.result

রেফারেন্স:


22
এটি কি প্রচুর কোডের মতো মনে হচ্ছে না এমন কোনও কিছুর জন্য যা সহজ হওয়া উচিত?
হেনলি চিউ

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

1
কিছু লোক সত্যই কলব্যাকের নরকের উপস্থিতি প্রমাণ করতে চায়। এটি বড় ব্লবগুলির জন্য অর্থবোধ করে, তবে সাধারণ ব্যবহারের ক্ষেত্রে জাভাস্ক্রিপ্টের উচিত একটি সিঙ্ক পদ্ধতি method
lama12345

এটি খুব দরকারী ছিল
জিমি ওবনিও অ্যাবোর

@ আনুজ আপনি ভুল করেছেন এটি উল্লেখ করা উচিত নয় this<EventTarget>.resultএটা ঠিক করা উচিত!
ট্রিপলস

17

মিঃ @ পোটাটোসালাদের উত্তরের পরিপূরক মাত্র।

অনলোড কলব্যাকের ফলাফল পাওয়ার জন্য আপনাকে আসলে ফাংশনের সুযোগ অ্যাক্সেস করতে হবে না , আপনি ইভেন্ট প্যারামিটারে নিখরচায় নিম্নলিখিতটি করতে পারেন :

var arrayBuffer;
var fileReader = new FileReader();
fileReader.onload = function(event) {
    arrayBuffer = event.target.result;
};
fileReader.readAsArrayBuffer(blob);

কেন এই ভাল? কারণ তখন আমরা প্রসঙ্গটি না হারিয়ে তীর ফাংশনটি ব্যবহার করতে পারি

var fileReader = new FileReader();
fileReader.onload = (event) => {
    this.externalScopeVariable = event.target.result;
};
fileReader.readAsArrayBuffer(blob);

15

অথবা আপনি ফেচ এপিআই ব্যবহার করতে পারেন

fetch(URL.createObjectURL(myBlob)).then(res => res.arrayBuffer())

পারফরম্যান্সের পার্থক্য কী তা আমি জানি না এবং এটি ডিভুলগুলিতে আপনার নেটওয়ার্ক ট্যাবেও প্রদর্শিত হবে।


17
বা কেবলnew Response(blob).arrayBuffer()
অন্তহীন

4

নেই এখন (যেমন, Chrome 76+ & মুক্তিযোদ্ধা 69+) একটি Blob.prototype.arrayBuffer () পদ্ধতি যা প্রতিশ্রুতি একটি ArrayBuffer ব্লব ডাটা প্রতিনিধিত্বমূলক সঙ্গে সমাধানে ফিরে আসবে।

(async () => {
  const blob = new Blob(['hello']);
  const buf = await blob.arrayBuffer();
  console.log( buf.byteLength ); // 5
})();


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