Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[suggestion] send/respond with blob #4807

Closed
jimmywarting opened this issue Feb 4, 2022 · 10 comments
Closed

[suggestion] send/respond with blob #4807

jimmywarting opened this issue Feb 4, 2022 · 10 comments
Labels

Comments

@jimmywarting
Copy link

jimmywarting commented Feb 4, 2022

NodeJS now has support for Blob's globally,
...earlier you had to load it from require('buffer').Blob

it would be cool / awesome if it where possible to respond with a Blob by doing something like

const str = `<h1>Hello World</h1>`
const blob = new Blob([str], { type: 'text/html' })
const file = new File([blob], 'index.html', { type: 'text/html' })

app.get('/', (req, res) => {
  res.send(blob) // or:
  res.download(blob, 'name.html')
  res.download(file) // name taken from file instead
})

Doing this would take care of

  1. Setting the response header content-type to the blob's type (only if content-type haven't been set manually)
  2. Setting the response header content-length to the blob's size
  3. and pipe the data from blob.stream() to the response
  4. if you used res.download(blob) then it would also add content-disposition attachment header

it's also looking like if node will at some point add a way of getting blobs from the filesystem also, but i don't know when.
ref: nodejs/node#39015

edit: NodeJS just shipped fs.openAsBlob(path, { type }) in v20+

@dougwilson
Copy link
Contributor

I think this is a great idea.

@jimmywarting
Copy link
Author

jimmywarting commented Feb 9, 2022

Yeay, then I could take advantage of fetch-blob/from.js methods that can retrieve a Blob/File from the file system. or use undici or node-fetch await res.blob() even

If you would accept 3th party blob look-a-like objects ofc...

this idea came to me when i worked on a current project that uses a template engine.
i just thought, wouldn't it be nice if consolidate.js or the static folder plugin could just simply give you a blob instead :P

var cons = require('consolidate');
cons.swig('views/page.html', function(err, blob){
  res.send(blob)
});

So if Blob are not the only thing you are going to support, then there is one extra idea coming from the File object
and that is to send lastModifiedDate as a caching header.
and also use the file.name when downloading using res.download(file)

@debadutta98
Copy link

Hi @dougwilson , i want to take up this issue can you please assign me ?

@jimmywarting
Copy link
Author

fyi, NodeJS just shipped fs.openAsBlob(path, { type }) in v20+
wish I where able to use it now.

@dougwilson
Copy link
Contributor

No worries, there is a PR open that is very close to landing 👍 . Should be in the next Express release.

@IamLizu
Copy link
Member

IamLizu commented Aug 3, 2024

I think we can close this one for now.

@mysuf
Copy link

mysuf commented Nov 29, 2024

@dougwilson It would be convenient to extend this to UInt8Array in general. Currently Express's v5 res.send(uint8ArrayData) converts binary data into json(!!) even though the header contains a Content-Type other than application/json which is obviously a bug. Any UInt8Array or its derivation should be treated as binary data, and no coercion should occur without presence of appropriate content-type or user's request to do so. Current workaround is to do Buffer.from(uint8ArrayData) before passing to send method.

@jimmywarting
Copy link
Author

@mysuf i deliberately asked for support for Blob b/c of not having to have all data buffered into the memory. A Blob can be a selection of data from multiple sources or being backed up by the filesystem to avoid having all in the memory.

image

imagine having to send a hole video file. a blob would be better than having a buffer.

support for uint8array should have it's own issue, since it's a hole thing. A Blob/File have information about mime type and filename, it can be streamed, have multiple data references point and concated without increasing memory.

@mysuf
Copy link

mysuf commented Dec 2, 2024

@jimmywarting I don't say that UInt8Array is better than Blob or that it should suport exclusively just UInt8Array. I just say that send method could support wider range of binary types that are usually somehow related to UInt8Array. Currently it sends UInt8Array converted to json instead so any support will be better than that. Many libraries that exports binary data uses just one memory chunk and leaves further handling to user. Ofc it is not supposed for large blobs.

@wesleytodd
Copy link
Member

Closing this in favor of continuing the conversation in #6285.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

6 participants