W3C home > Mailing lists > Public > public-webapps@w3.org > October to December 2010

Re: using BlobBuilder append method with generated binary data

From: Toni Ruottu <toni.ruottu@iki.fi>
Date: Mon, 20 Dec 2010 19:15:30 +0200
Message-ID: <AANLkTin5+v+RaN4ZnMKWB_GnUSb_WBnaW433YhHtUVSh@mail.gmail.com>
To: Paul Kinlan <paulkinlan@google.com>
Cc: Eric Uhrhane <ericu@google.com>, "public-webapps@w3.org" <public-webapps@w3.org>
I can not pinpoint the section in typed arrays spec that tells you can
use views without separately creating a buffer first. However I tested
the code that you show me, and it worked. Am I looking at the wrong
specification, or is this nonstandard behavior, or what? Could someone
point out the exact location that mentions this way of using
Uint8Array?

  thank you on forehand, --Toni

On Mon, Dec 6, 2010 at 10:41 PM, Paul Kinlan <paulkinlan@google.com> wrote:
> That's what I thought when I first looked at it, however you can pre-set the
> array length and then iterate over every byte and set it. It is not ideal,
> but works.  I have it running on http://appmator.appspot.com/ but it
> basically boils down to the following:
> var ui8a = new Uint8Array(output.length);
>
> for(var i = 0; i< output.length; i++) {
>   ui8a[i] = output.charCodeAt(i);
> }
>
> bb.append(ui8a.buffer);
>
> var blob = bb.getBlob("application/octet-stream");
> var saveas = document.createElement("iframe");
> saveas.style.display = "none";
> saveas.src = window.createObjectURL(blob);
> P
> On Mon, Dec 6, 2010 at 8:34 PM, Toni Ruottu <toni.ruottu@iki.fi> wrote:
>>
>> I do not think UInt8Array has any data. It is just a view for
>> accessing the buffer.
>>
>>  --Toni
>>
>> On Sat, Dec 4, 2010 at 1:12 AM, Paul Kinlan <paulkinlan@google.com> wrote:
>> > I might have missed something but for appending client-side generated
>> > data to a blob can't you just append a UInt8Array as that is based off
>> > ArrayBuffer?
>> >
>> > I use it to generate zip files client side and attach them to an
>> > iframe so they are downloaded.
>> >
>> > P
>> > On Thursday, December 2, 2010, Toni Ruottu <toni.ruottu@iki.fi> wrote:
>> >> My code had a bug in it. The APIs seem to be working ok for my
>> >> purposes.
>> >> Using the APIs, I was able to write Firefox's sendAsBinary method for
>> >> chrome.
>> >> It is available from http://javascript0.org/wiki/Portable_sendAsBinary
>> >>
>> >>   --Toni
>> >>
>> >> On Tue, Nov 16, 2010 at 5:25 PM, Toni Ruottu <toni.ruottu@iki.fi>
>> >> wrote:
>> >>> Sorry for slow answer. Took me a while to get on top of this. I think
>> >>> they just might answer my problem. However, I can not really tell
>> >>> before I see a working implementation. I wrote a test. See
>> >>> http://www.cs.helsinki.fi/u/twruottu/testi/bpost3.html It does not
>> >>> currently work with the latest development version of Chrome. I
>> >>> wonder, if I am doing something wrong.
>> >>>
>> >>>  --Toni
>> >>>
>> >>> On Wed, Oct 20, 2010 at 6:17 PM, Eric Uhrhane <ericu@google.com>
>> >>> wrote:
>> >>>> Toni:
>> >>>>
>> >>>>    BlobBuilder now has an append() method that takes an ArrayBuffer,
>> >>>> and FileReader has readAsArrayBuffer.  Do these together satisfy your
>> >>>> needs?
>> >>>>
>> >>>>        Eric
>> >>>>
>> >>>> On Wed, Oct 20, 2010 at 3:39 AM, Toni Ruottu <toni.ruottu@iki.fi>
>> >>>> wrote:
>> >>>>> I have discussed the topic before on some Chromium bug threads. I
>> >>>>> searched the archives of this mailing list for blobs and generated
>> >>>>> content, but was not too successful. There may be multiple different
>> >>>>> reasons why one would need to build blobs from generated data. The
>> >>>>> one
>> >>>>> that concerns me, is being able to do binary POSTs with
>> >>>>> XmlHTTPRequest
>> >>>>> in a standard manner. To send binary data over XHR one is required
>> >>>>> to
>> >>>>> send out a blob, but first the blob needs to be constructed with
>> >>>>> BlobBuilder. Let me fill you in on how I see the current situation.
>> >>>>> Maybe someone can spot an error in my line of thought.
>> >>>>>
>> >>>>> A new (empty) BlobBuilder is created by stating...
>> >>>>> var bb = new BlobBuilder();
>> >>>>>
>> >>>>> After creating a BlobBuilder, the user appends some data into the
>> >>>>> blob
>> >>>>> being generated by using the append function. The append function is
>> >>>>> overloaded and can be used to append multiple different types of
>> >>>>> data
>> >>>>> into the blob. Currently only existing blobs, and utf-8 text are
>> >>>>> supported.
>> >>>>>
>> >>>>> One can add an existing blob into the new one by doing...
>> >>>>> bb.append(existingBlob);
>> >>>>>
>> >>>>> One can add a text string in utf-8 format by doing...
>> >>>>> bb.append(aTextString);
>> >>>>>
>> >>>>> Once the data is in there, it is possible to construct the new blob
>> >>>>> with...
>> >>>>> var blob = bb.getBlob()
>> >>>>>
>> >>>>> A blob has a slice method which makes it possible to turn a large
>> >>>>> blob
>> >>>>> into smaller ones. It is thus possible to cut out single bytes from
>> >>>>> a
>> >>>>> blob and use them construct new blobs by appending copies of these
>> >>>>> sample bytes together with the BlobBuilder.
>> >>>>>
>> >>>>> As sample bytes can only be generated by writing text into the blob
>> >>>>> as
>> >>>>> utf-8, it is not possible to generate all 8-bit patterns. More
>> >>>>> specifically, the bit patterns that are illegal in any given utf-8
>> >>>>> string, are not possible to generate using the current API. This
>> >>>>> leads
>> >>>>> developers into using various hacks to overcome the issue.
>> >>>>>
>> >>>>> For example one could ask the user to provide a file with sample
>> >>>>> bytes. Methods for reading a file into a blob are available, so
>> >>>>> there
>> >>>>> is no need to generate the sample bytes. There is however no way to
>> >>>>> make sure that the user provided a file with correct bit-patterns as
>> >>>>> the blob interface is to a large degree a read-only interface. A
>> >>>>> demonstration of using a file to overcome the issue is available at
>> >>>>> http://www.cs.helsinki.fi/u/twruottu/testi/bpost.html
>> >>>>>
>> >>>>> To solve the problem a third append function which accepts a list of
>> >>>>> integers, and adds the corresponding bytes into the blob is needed.
>> >>>>> Once such method has been introduced it should be possible to write
>> >>>>> the 7-bit ascii string "foo" into a BlobBuilder by doing...
>> >>>>> bb.append([102,111,111]);
>> >>>>>
>> >>>>> It should also be possible to add bytes 0x00 a
>> >
>> > --
>> > Paul Kinlan
>> > Developer Advocate @ Google for Chrome and HTML5
>> > t: +447730517944
>> > tw: @Paul_Kinlan <http://twitter.com/paul_kinlan>
>> > LinkedIn: http://uk.linkedin.com/in/paulkinlan
>> > Blog: http://paul.kinlan.me
>> > Skype: paul.kinlan
>> >
>
>
>
> --
> Paul Kinlan
> Developer Advocate @ Google for Chrome and HTML5
> t: +447730517944
> tw: @Paul_Kinlan
> LinkedIn: http://uk.linkedin.com/in/paulkinlan
> Blog: http://paul.kinlan.me
> Skype: paul.kinlan
>
Received on Monday, 20 December 2010 17:16:04 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 18:49:42 GMT