app.post('/asset', function(request, response){
var tempFile="/home/applmgr/Desktop/123456.pdf";
fs.readFile(tempFile, function (err,data){
response.contentType("application/pdf");
response.send(data);
});
});
I am a new bie to expressjs, I can't send the response with the data object. The binary content is visible in the browser. Give me suggestions how to handle this ?
It is as simple as following code:
For complete repo:
Clone node-cheat pdf_browser, run
node app
followed bynpm install express
.Happy Helping!
Specifying how a file download is handled all comes down to the
Content-disposition
header. You can also specify the name of the file here as well. We also set theContent-type
to ensure the browser knows what to do with the file given to it.Express.js Example:
Now if you look more closely at the
Content-disposition
, you'll notice theinline;
field is what sets how the browser reacts to the file. If you want to force downloads, you can do so by settinginline;
toattachment;
I've also found out (by being burnt a couple times), that if you set special characters in your filename, it can break. So I
encodeURIComponent()
the filename to ensure that doesn't happen.Hope that helps others trying to figure out the same!
Edit
In the time between me posting this originally and now, I've found out how to correctly encode the
content-disposition
's filename parameter. According to the spec, the filename should be RFC5987 encoded. I ended up finding an example code snippet from MDN that correctly handles the encoding here (encodeURIComponent()
isn't the entirely correct format for this field).MDN Snippet
Another note on top of this one, browsers don't fully comply with the spec either. Some characters will still come back incorrectly from a download (at least when I tested it).
You can get around this problem by updating how your downloads work. If your download URL ends with the filename (and you don't supply a
filename
attribute in the header), it will correctly get the filename from the URL encoded value. IE'http://subdomain.domain-url.com/some/path/to/downloads/' + encodeURIComponent("You're there, download this!.pdf")
Jeeze, and all to supply a file name to your downloads!
Actually Express already has this feature for sending files. All you need is :
Here the server will send the file "Rabbi.pdf" and it will open in browser like you open pdf in browser. I placed the file in "static" folder but you can place it anywhere, knowing that sendFile() takes as argument the absolute path (not relative one).
My Solution for sending a PDF directly to the Browser:
res.end() with the second param 'binary' did the trick in my case. Otherwise express interpret it as a string
I tested your code and it works for me in chrome with one change: Change
app.post
toapp.get
EDIT: since you seem to think a POST-only server is a good idea, read this: http://net.tutsplus.com/tutorials/other/a-beginners-introduction-to-http-and-rest/ Scroll down until the HTTP verbs and check out the difference between GET and POST. :)
Some quick research suggests that other browsers might have other issues, IE for example might expect the URL to end in
.pdf
. Since I'm on my Mac I can't test that for you ;)