- From: Steve VanDeBogart <vandebo@google.com>
- Date: Fri, 2 Dec 2011 11:20:01 -0800
- To: Glenn Maynard <glenn@zewt.org>
- Cc: public-webapps <public-webapps@w3.org>, Tony Payne <tpayne@google.com>
- Message-ID: <CA+9kOWN_AN9vcVr0iXmm9P5eH7ZS1FEf0X8dJAgHJk26X9niVQ@mail.gmail.com>
On Thu, Dec 1, 2011 at 8:58 AM, Glenn Maynard <glenn@zewt.org> wrote: > On Tue, Nov 29, 2011 at 4:09 PM, Steve VanDeBogart <vandebo@google.com>wrote: > >> In several thought experiments using the File API I've wanted to create a >> Blob for data that I haven't materialized. It seems that a way to create a >> blob backed by an arbitrary data source would be useful. In particular, I >> would like to see a blob constructor that takes a URL and size as well as >> one that takes a callback. >> >> A URL constructed blob could use a byte range request when a FileReader >> requests a slice of the blob. i.e the internal implementation could be >> reasonably efficient. >> > > Note that since Blobs need to know their size when constructed, > constructing a blob like this would need to be async. > > That would also imply that if you read a whole file this way, you're > always going to make two HTTP requests; a HEAD to determine the size and > then a GET. > This is why I suggested the constructor take a URL and a size, since you might already know it. Though I guess with an async constructor the size could be optional and if it isn't present a HEAD request could determine it. > A callback backed blob would be a bit more complicated. Maybe something >> like the interface below, though you'd probably need another level of >> indirection in order to deal with concurrency. >> >> interface BlobDataProvider : EventTarget { >> void getDataSlice(long long start, long long end); >> void abort(); >> >> readonly attribute any result; >> readonly attribute unsigned short readyState; >> >> attribute [TreatNonCallableAsNull] Function? onloadstart; >> attribute [TreatNonCallableAsNull] Function? onprogress; >> attribute [TreatNonCallableAsNull] Function? onload; >> attribute [TreatNonCallableAsNull] Function? onabort; >> attribute [TreatNonCallableAsNull] Function? onerror; >> attribute [TreatNonCallableAsNull] Function? onloadend; >> } >> > > FYI: > http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-January/029998.html > > FWIW, I was thinking along these lines: > > interface BlobDataProvider : EventTarget { > void getSize(BlobDataProviderResult result); > void getDataSlice(long long start, long long end, BlobDataProviderResult > result); > } > As you say, since the size is an attribute of the blob, I don't see the benefit to making it part of the callback... I guess unless you're trying to support the streaming blob case. But maybe that's just an argument for making it an async function instead of an attribute in the Blob interface. > interface BlobDataProviderResult : EventTarget { > void result(any data); > void error(); > attribute [TreatNonCallableAsNull] Function? onabort; > } > > result can be called multiple times, to provide data incrementally. > Progress events are up to the browser. > > That said, the only use case I've seen for it is weak DRM, which isn't > very interesting. The use case I've been thinking about is getting metadata out of files. So I may want to examine a slice at the beginning of a file and then,look at other slices at the end or various places in the middle. For a local file, not a problem, but if you want to integrate an online file provider, (drop box or something else of that ilk), you can either use a file/callback based blob, or build a second interface to accessing file data into your webapp. It all feels cleaner and nicer if just a single interface can be used. It seems you've been following this issue longer than I, do you know of a bug filed against the File API for something like this? If not, I'll probably file one. -- Steve
Received on Friday, 2 December 2011 19:20:50 UTC