Keep in mind the recent discussion from Moz: that IFRAME needs to be within the DOM tree to work on FF4 and below. I'm going to track down some more discussion there, so warning, that statement isn't fact checked yet.

Afaik, WebKit (or just Chrome) does not have that restriction, and iframes can be moved across DOMs
without re-initializing the underlying content window.


On 12/6/2010 12:41 PM, Paul Kinlan 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 <[email protected] <mailto:[email protected]>> 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 <[email protected]
    <mailto:[email protected]>> 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 <[email protected]
    <mailto:[email protected]>> 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
    <[email protected] <mailto:[email protected]>> 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
    <[email protected] <mailto:[email protected]>> 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
    <[email protected] <mailto:[email protected]>> 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

Reply via email to