Convert raw buffer data to a JPEG image - javascript

This question is a follow-up from this answer. I'm asking it as a question because I don't have enough reputation to make comments.
I am trying to write an Android app that takes an image and sends it to a Node.js server.
I found this code in the post linked above, but it leaves me with a raw buffer of data. How can I save the contents of this buffer as a JPEG image?
app.post('/upload-image', rawBody, function(req, res) {
if (req.rawBody && req.bodyLength > 0) {
// TODO save image (req.rawBody) somewhere
// send some content as JSON
res.send(200, {
status: 'OK'
});
} else {
res.send(500);
}
});
function rawBody(req, res, next) {
var chunks = [];
req.on('data', function(chunk) {
chunks.push(chunk);
});
req.on('end', function() {
var buffer = Buffer.concat(chunks);
req.bodyLength = buffer.length;
req.rawBody = buffer;
next();
});
req.on('error', function(err) {
console.log(err);
res.status(500);
});
}

You can simply use writeFile
Pass the file path as first argument, your buffer as second argument, and a callback to execute code when the file has been written.
Alternatively, use writeFileSync, a synchronous version of writeFile which doesn't take a callback

Related

How can a http.createServer receive data from needle.post using fs.createReadStream

I want to send an image from a nodejs server to another nodejs server.
I understand there are a lot of solutions, but I hoping to find out how to do it in the following way:
Server A (Sender)
Option 1
needle.post('http://127.0.0.1:8000', fs.createReadStream('test.png'), function(err, resp, body) {
});
Option 2
var reader = fs.createReadStream('test.png');
reader.pipe(request.post('http://127.0.0.1:8000'));
Server B (Receiver)
http.createServer(function(req, res) {
if (req.method === 'PUT' || req.method === 'POST') {
req.on('data', function(chunked) {
// I got nothing here
});
res.on('data', function(chunked) {
// I got nothing here
});
}
}).listen(8000, function() {
console.log('Listening for requests');
});
The problem is that if I read the file data that is sent over using fs.createReadStream, I am not able to receive any data from Server B.
[Edit] Also need to know how to handle the above using Express
You can try to create the fs.createWriteStream() and assign to req.pipe().
...
var saveTo = './test.png',
ws = fs.createWriteStream(saveTo);
ws.on('close', function () {
cb();
});
req.pipe(ws);
...
As mentioned by zangw in comments, the script actually works. My bad that my test.png is blank

nodejs write after request end error

I am facing problem of write after request end in nodejs :
I have a server.js file , which sends request to other js file (say abc.js) which sends response back to server.js file and then server.js file writes the resoponse and then end response.
my problem is if I write response in abc.js and end it there only it works fine, but if it is in sererconf.js it doesn't.
Let me make it clear that I get this bug only when i send 20-30 requests at a time. I want to know the logic behind it, I searched a lot, but no nice answer found, any help will be appreciated.
server.js full code:
/* create HTTP server */
var httpd = http.createServer(function(req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.writeHead(200, {"Content-Type" : "application/json"});
}).listen(3800);
/* send request to the file mentioned in url*/
httpd.on('request', function(req, res) {
urll = __dirname + '/..' + req.url;
fs.exists(urll, function (exists) {
if(exists){
var server = require(urll);
server.get(req,res);
}
});
module.exports = {
result : function(result){
if(Array.isArray(result)){
for(var key in result){
result[key] = JSON.parse(result[key]);
}
}
result = JSON.stringify(result);
res.write(result ,function(err) { if(!err) res.end(); });
},
};
});
**apps.js code**:
var constants = require('./lib/constant.js');
var APP_PATH = constants.APP_PATH;
module.exports = {
get : function(req) {
req.on('data', function(chunk) {
var hash = chunk;
hash = JSON.parse(hash);
var id = hash.id;
dirPath = APP_PATH + id;
fs.exists( dirPath, function (exists) {
if(exists)
read_app_dir(dirPath);
else
taskDone([]);
});
});
}
};
function read_app_dir(app_dir){
fs.readdir(app_dir,function(err, list){
if (err) {
httpd.log.info('cannot read apps dir at s_apps = '+err);
}else{
create_new_obj(list,app_dir);
}
});
}
function create_new_obj(list, app_dir){
appFilesObj = [];
var i = 0;
list.forEach(function(file) {
i=i+1;
file = app_dir +'/' +file;
appFilesObj.push(file);
if(i == Object.keys(list).length)
read_app_files(appFilesObj);
});
}
function read_app_files(appFilesObj,app_dir){
var apps = [];
var i = 0;
if(Object.keys(appFilesObj).length > 0){
appFilesObj.forEach(function(appfile) {
read_file(appfile,function(data){ i=i+1;
apps.push(data);
if(i == Object.keys(appFilesObj).length)
taskDone(apps);
});
});
}else{
taskDone([]);
}
}
function read_file(file,callback){
fs.readFile(file,'utf8', function (err, data) {
if (err)
httpd.log.info('cannot read file at s_apps = '+err);
else
callback(data);
});
}
function taskDone(apps){
var httpd = require(__dirname + '/server.js');
httpd.result(apps);
}
if I do res.write and res.end in this file in taskDone() then it works fine.
Thanks in advance :)
The problem with above code was, that I was sending back response by calling an exported function of server.js
like this:
var httpd = require(__dirname + '/server.js');
httpd.result(apps);
where result() is the function which I have exported in server.js to write response and end response
Instead of this, now I added a callback support while calling function of other files (ex-apps.js), so that I "res.write" and "res.end()" only when the actually called function gives back the response.
(I am not writing the whole code , please refer above code for difference in both)
httpd.on('request', function(req, res) {
urll = __dirname + '/..' + req.url;
fs.exists(urll, function (exists) {
if(exists){
var server = require(urll);
server.get(req,res,function(result){
res.write(result);
res.end();
});
}
});
**apps.js**
get : function(req, callback) {
req.on('data', function(chunk) {
//when task is done and taskDone() function is called I just callback() the result
function taskDone(result){
callback(result);
}
}
}
When I was sending result back by calling a function of server.js and then writing the response...I don't know how..but somehow server was getting confused in multiple requests and saying "write after end" error...while the end was called by some other user's request.
I may be wrong, but this is what I concluded from this :)
I hope this may help others.

Node.js - Check if stream has error before piping response

In Node.js, say that I want to read a file from somewhere and stream the response (e.g., from the filesystem using fs.createReadStream()).
application.get('/files/:id', function (request, response) {
var readStream = fs.createReadStream('/saved-files/' + request.params.id);
var mimeType = getMimeTypeSomehow(request.params.id);
if (mimeType === 'application/pdf') {
response.set('Content-Range', ...);
response.status(206);
} else {
response.status(200);
}
readStream.pipe(response);
});
However, I want to detect if there is an error with the stream before sending my response headers. How do I do that?
Pseudocode:
application.get('/files/:id', function (request, response) {
var readStream = fs.createReadStream('/saved-files/' + request.params.id);
readStream.on('ready', function () {
var mimeType = getMimeTypeSomehow(request.params.id);
if (mimeType === 'application/pdf') {
response.set('Content-Range', ...);
response.status(206);
} else {
response.status(200);
}
readStream.pipe(response);
});
readStream.on('error', function () {
response.status(404).end();
});
});
Write stream is ended when readStream ends or has an error. You can prevent this default behaviour by passing end:false during pipe and end the write stream manually.
So even if the error occurs, your write stream is still open and you can do other stuff(e.g. sending 404 status) with writestream in the error callback.
var readStream = fs.createReadStream('/saved-files/' + request.params.id);
readStream.on('error', function () {
res.status(404).end();
});
readStream.on('end', function(){
res.end(); //end write stream manually when readstream ends
})
readStream.pipe(res,{end:false}); // prevent default behaviour
Update 1: For file streams, you can listen for open event to check if the file is ready to read:
readStream.on('open', function () {
// set response headers and status
});
Update 2: As OP mentioned there may be no open event for other streams, we may use the following if the stream is inherited from node's stream module. The trick is we write the data manually instead of pipe() method. That way we can do some 'initialization' on writable before starting to write first byte.
So we bind once('data') first and then bind on('data'). First one will be called before actual writing is happened.
readStream
.on('error',function(err) {
res.status(404).end();
})
.once('data',function(){
//will be called once and before the on('data') callback
//so it's safe to set headers here
res.set('Content-Type', 'text/html');
})
.on('data', function(chunk){
//now start writing data
res.write(chunk);
})
.on('end',res.end.bind(res)); //ending writable when readable ends

Function to check if externally hosted textfile contains string acting slow- Node

I have the following code, which will retrieve a text file from an external server, and search the file for a specific string.
The function:
function checkStringExistsInFile(String, cb) {
var opt = {
host: 'site.com',
port: 80,
path: '/directory/data.txt',
method: 'GET',
};
var request = http.request(opt, function(response){
response
.on('data', function(data){
var string = data+"";
var result = ((string.indexOf(" "+ String +" ")!=-1)?true:false);
cb(null, result);
})
.on('error', function(e){
console.log("-ERR: Can't get file. "+JSON.stringify(e));
if(cb) cb(e);
})
.on('end', function(){
console.log("+INF: End of request");
});
});
request.end();
}
And this is where I call the function, and do something with the results.
checkStringExistsInFile(String, function(err, result){
if(!err) {
if(result) {
//there was a result
} else {
//string not present in file
}
} else {
// error occured
}
});
This worked great in the beginning (small text file), but my textfile is getting larger (4000 characters+) and this is not working anymore.
What can I do to solve this? Should I safe the temporary save the file on my server first, should I open the file as a stream?
It would be appreciated if you can support your answer with a relevant example. Thanks in advance!
Documentation :
If you attach a data event listener, then it will switch the stream into flowing mode, and data will be passed to your handler as soon as it is available.
If you just want to get all the data out of the stream as fast as possible, this is the best way to do so.
http://nodejs.org/api/stream.html#stream_event_data
Data event is emitted as soon as there are data, even if the stream is not completely loaded. So your code just look for your string in the first lines of your stream, then callbacks.
What to do ?
Your function should only call callback on the end() event, or as soon as it finds something.
function checkStringExistsInFile(String, cb) {
var opt = {
host: 'site.com',
port: 80,
path: '/directory/data.txt',
method: 'GET',
};
var request = http.request(opt, function(response){
var result = false;
response
.on('data', function(data){
if(!result) {
var string = data+"";
result = (string.indexOf(" "+ String +" ")!=-1);
if(result) cb(null, result);
}
})
.on('error', function(e){
console.log("-ERR: Can't get file. "+JSON.stringify(e));
if(cb) cb(e);
})
.on('end', function(){
console.log("+INF: End of request");
cb(null, result)
});
});
request.end();
}

How do I set a MIME type before sending a file in Node.js?

When sending scripts from my Node.js server to the browser, in Google Chrome, I get this warning:
Resource interpreted as Script but transferred with MIME type
text/plain
I Google'd around, and found out that it's a server-side problem, namely, I think that I should set the correct MIME type to things, before sending them. Here's the HTTP server's handler:
var handler = function(req, res)
{
url = convertURL(req.url); //I implemented "virtual directories", ignore this.
if (okURL(url)) //If it isn't forbidden (e.g. forbidden/passwd.txt)
{
fs.readFile (url, function(err, data)
{
if (err)
{
res.writeHead(404);
return res.end("File not found.");
}
//I think that I need something here.
res.writeHead(200);
res.end(data);
});
}
else //The user is requesting an out-of-bounds file.
{
res.writeHead(403);
return res.end("Forbidden.");
}
}
Question: How do I correct my server-side code to configure the MIME type correctly?
(Note: I already found https://github.com/broofa/node-mime, but it only lets me determine the MIME type, not to "set" it.)
I figured it out!
Thanks to #rdrey's link and this node module I managed to correctly set the MIME type of the response, like this:
function handler(req, res) {
var url = convertURL(req.url);
if (okURL(url)) {
fs.readFile(url, function(err, data) {
if (err) {
res.writeHead(404);
return res.end("File not found.");
}
res.setHeader("Content-Type", mime.lookup(url)); //Solution!
res.writeHead(200);
res.end(data);
});
} else {
res.writeHead(403);
return res.end("Forbidden.");
}
}
Search google for the Content-Type HTTP header.
Then figure out how to set it with http://expressjs.com/api.html#res.set
Oops, the example includes your answer ;)
Simply check the file ending, if it's .js, set the appropriate MIME type to make browsers happy.
EDIT: In case this is pure node, without express, look here: http://nodejs.org/api/http.html#http_response_setheader_name_value
mime.lookup() is now renamed to mime.getType().
So you can do like this:
res.set('Content-Type', mime.getType('path/file'));
https://www.npmjs.com/package/mime
You can copy the following JSON, containing a comprehensive list of mime types,
{".x3d":"application/vnd.hzn-3d-crossword",".3gp":"video/3gpp",".3g2":"video/3gpp2",".mseq":"application/vnd.mseq",".pwn":"application/vnd.3m.post-it-notes",".plb":"application/vnd.3gpp.pic-bw-large",".psb":"application/vnd.3gpp.pic-bw-small",".pvb":"application/vnd.3gpp.pic-bw-var",".tcap":"application/vnd.3gpp2.tcap",".7z":"application/x-7z-compressed",".abw":"application/x-abiword",".ace":"application/x-ace-compressed",".acc":"application/vnd.americandynamics.acc",".acu":"application/vnd.acucobol",".atc":"application/vnd.acucorp",".adp":"audio/adpcm",".aab":"application/x-authorware-bin",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".air":"application/vnd.adobe.air-application-installer-package+zip",".swf":"application/x-shockwave-flash",".fxp":"application/vnd.adobe.fxp",".pdf":"application/pdf",".ppd":"application/vnd.cups-ppd",".dir":"application/x-director",".xdp":"application/vnd.adobe.xdp+xml",".xfdf":"application/vnd.adobe.xfdf",".aac":"audio/x-aac",".ahead":"application/vnd.ahead.space",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".ami":"application/vnd.amiga.ami","N/A":"application/andrew-inset",".apk":"application/vnd.android.package-archive",".cii":"application/vnd.anser-web-certificate-issue-initiation",".fti":"application/vnd.anser-web-funds-transfer-initiation",".atx":"application/vnd.antix.game-component",".dmg":"application/x-apple-diskimage",".mpkg":"application/vnd.apple.installer+xml",".aw":"application/applixware",".les":"application/vnd.hhe.lesson-player",".swi":"application/vnd.aristanetworks.swi",".s":"text/x-asm",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".ac":"application/pkix-attr-cert",".aif":"audio/x-aiff",".avi":"video/x-msvideo",".aep":"application/vnd.audiograph",".dxf":"image/vnd.dxf",".dwf":"model/vnd.dwf",".par":"text/plain-bas",".bcpio":"application/x-bcpio",".bin":"application/octet-stream",".bmp":"image/bmp",".torrent":"application/x-bittorrent",".cod":"application/vnd.rim.cod",".mpm":"application/vnd.blueice.multipass",".bmi":"application/vnd.bmi",".sh":"application/x-sh",".btif":"image/prs.btif",".rep":"application/vnd.businessobjects",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".csh":"application/x-csh",".c":"text/x-c",".cdxml":"application/vnd.chemdraw+xml",".css":"text/css",".cdx":"chemical/x-cdx",".cml":"chemical/x-cml",".csml":"chemical/x-csml",".cdbcmsg":"application/vnd.contact.cmsg",".cla":"application/vnd.claymore",".c4g":"application/vnd.clonk.c4group",".sub":"image/vnd.dvb.subtitle",".cdmia":"application/cdmi-capability",".cdmic":"application/cdmi-container",".cdmid":"application/cdmi-domain",".cdmio":"application/cdmi-object",".cdmiq":"application/cdmi-queue",".c11amc":"application/vnd.cluetrust.cartomobile-config",".c11amz":"application/vnd.cluetrust.cartomobile-config-pkg",".ras":"image/x-cmu-raster",".dae":"model/vnd.collada+xml",".csv":"text/csv",".cpt":"application/mac-compactpro",".wmlc":"application/vnd.wap.wmlc",".cgm":"image/cgm",".ice":"x-conference/x-cooltalk",".cmx":"image/x-cmx",".xar":"application/vnd.xara",".cmc":"application/vnd.cosmocaller",".cpio":"application/x-cpio",".clkx":"application/vnd.crick.clicker",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".wbs":"application/vnd.criticaltools.wbs+xml",".cryptonote":"application/vnd.rig.cryptonote",".cif":"chemical/x-cif",".cmdf":"chemical/x-cmdf",".cu":"application/cu-seeme",".cww":"application/prs.cww",".curl":"text/vnd.curl",".dcurl":"text/vnd.curl.dcurl",".mcurl":"text/vnd.curl.mcurl",".scurl":"text/vnd.curl.scurl",".car":"application/vnd.curl.car",".pcurl":"application/vnd.curl.pcurl",".cmp":"application/vnd.yellowriver-custom-menu",".dssc":"application/dssc+der",".xdssc":"application/dssc+xml",".deb":"application/x-debian-package",".uva":"audio/vnd.dece.audio",".uvi":"image/vnd.dece.graphic",".uvh":"video/vnd.dece.hd",".uvm":"video/vnd.dece.mobile",".uvu":"video/vnd.uvvu.mp4",".uvp":"video/vnd.dece.pd",".uvs":"video/vnd.dece.sd",".uvv":"video/vnd.dece.video",".dvi":"application/x-dvi",".seed":"application/vnd.fdsn.seed",".dtb":"application/x-dtbook+xml",".res":"application/x-dtbresource+xml",".ait":"application/vnd.dvb.ait",".svc":"application/vnd.dvb.service",".eol":"audio/vnd.digital-winds",".djvu":"image/vnd.djvu",".dtd":"application/xml-dtd",".mlp":"application/vnd.dolby.mlp",".wad":"application/x-doom",".dpg":"application/vnd.dpgraph",".dra":"audio/vnd.dra",".dfac":"application/vnd.dreamfactory",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dwg":"image/vnd.dwg",".geo":"application/vnd.dynageo",".es":"application/ecmascript",".mag":"application/vnd.ecowin.chart",".mmr":"image/vnd.fujixerox.edmics-mmr",".rlc":"image/vnd.fujixerox.edmics-rlc",".exi":"application/exi",".mgz":"application/vnd.proteus.magazine",".epub":"application/epub+zip",".eml":"message/rfc822",".nml":"application/vnd.enliven",".xpr":"application/vnd.is-xpr",".xif":"image/vnd.xiff",".xfdl":"application/vnd.xfdl",".emma":"application/emma+xml",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".fst":"image/vnd.fst",".fvt":"video/vnd.fvt",".fbs":"image/vnd.fastbidsheet",".fe_launch":"application/vnd.denovo.fcselayout-link",".f4v":"video/x-f4v",".flv":"video/x-flv",".fpx":"image/vnd.fpx",".npx":"image/vnd.net-fpx",".flx":"text/vnd.fmi.flexstor",".fli":"video/x-fli",".ftc":"application/vnd.fluxtime.clip",".fdf":"application/vnd.fdf",".f":"text/x-fortran",".mif":"application/vnd.mif",".fm":"application/vnd.framemaker",".fh":"image/x-freehand",".fsc":"application/vnd.fsc.weblaunch",".fnc":"application/vnd.frogans.fnc",".ltf":"application/vnd.frogans.ltf",".ddd":"application/vnd.fujixerox.ddd",".xdw":"application/vnd.fujixerox.docuworks",".xbd":"application/vnd.fujixerox.docuworks.binder",".oas":"application/vnd.fujitsu.oasys",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".fg5":"application/vnd.fujitsu.oasysgp",".bh2":"application/vnd.fujitsu.oasysprs",".spl":"application/x-futuresplash",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gmx":"application/vnd.gmx",".gtw":"model/vnd.gtw",".txd":"application/vnd.genomatix.tuxedo",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".gdl":"model/vnd.gdl",".gex":"application/vnd.geometry-explorer",".gxt":"application/vnd.geonext",".g2w":"application/vnd.geoplan",".g3w":"application/vnd.geospace",".gsf":"application/x-font-ghostscript",".bdf":"application/x-font-bdf",".gtar":"application/x-gtar",".texinfo":"application/x-texinfo",".gnumeric":"application/x-gnumeric",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".gqf":"application/vnd.grafeq",".gif":"image/gif",".gv":"text/vnd.graphviz",".gac":"application/vnd.groove-account",".ghf":"application/vnd.groove-help",".gim":"application/vnd.groove-identity-message",".grv":"application/vnd.groove-injector",".gtm":"application/vnd.groove-tool-message",".tpl":"application/vnd.groove-tool-template",".vcg":"application/vnd.groove-vcard",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hdf":"application/x-hdf",".rip":"audio/vnd.rip",".hbci":"application/vnd.hbci",".jlt":"application/vnd.hp-jlyt",".pcl":"application/vnd.hp-pcl",".hpgl":"application/vnd.hp-hpgl",".hvs":"application/vnd.yamaha.hv-script",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".stk":"application/hyperstudio",".hal":"application/vnd.hal+xml",".html":"text/html",".irm":"application/vnd.ibm.rights-management",".sc":"application/vnd.ibm.secure-container",".ics":"text/calendar",".icc":"application/vnd.iccprofile",".ico":"image/x-icon",".igl":"application/vnd.igloader",".ief":"image/ief",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".rif":"application/reginfo+xml",".3dml":"text/vnd.in3d.3dml",".spot":"text/vnd.in3d.spot",".igs":"model/iges",".i2g":"application/vnd.intergeo",".cdy":"application/vnd.cinderella",".xpw":"application/vnd.intercon.formnet",".fcs":"application/vnd.isac.fcs",".ipfix":"application/ipfix",".cer":"application/pkix-cert",".pki":"application/pkixcmp",".crl":"application/pkix-crl",".pkipath":"application/pkix-pkipath",".igm":"application/vnd.insors.igm",".rcprofile":"application/vnd.ipunplugged.rcprofile",".irp":"application/vnd.irepository.package+xml",".jad":"text/vnd.sun.j2me.app-descriptor",".jar":"application/java-archive",".class":"application/java-vm",".jnlp":"application/x-java-jnlp-file",".ser":"application/java-serialized-object",".java":"text/x-java-source,java",".js":"application/javascript",".json":"application/json",".joda":"application/vnd.joost.joda-archive",".jpm":"video/jpm",".pjpeg":"image/pjpeg",".jpgv":"video/jpeg",".ktz":"application/vnd.kahootz",".mmd":"application/vnd.chipnuts.karaoke-mmd",".karbon":"application/vnd.kde.karbon",".chrt":"application/vnd.kde.kchart",".kfo":"application/vnd.kde.kformula",".flw":"application/vnd.kde.kivio",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".ksp":"application/vnd.kde.kspread",".kwd":"application/vnd.kde.kword",".htke":"application/vnd.kenameaapp",".kia":"application/vnd.kidspiration",".kne":"application/vnd.kinar",".sse":"application/vnd.kodak-descriptor",".lasxml":"application/vnd.las.las+xml",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".jam":"application/vnd.jam",".123":"application/vnd.lotus-1-2-3",".apr":"application/vnd.lotus-approach",".pre":"application/vnd.lotus-freelance",".nsf":"application/vnd.lotus-notes",".org":"application/vnd.lotus-organizer",".scm":"application/vnd.lotus-screencam",".lwp":"application/vnd.lotus-wordpro",".lvp":"audio/vnd.lucent.voice",".m3u":"audio/x-mpegurl",".m4v":"video/x-m4v",".hqx":"application/mac-binhex40",".portpkg":"application/vnd.macports.portpkg",".mgp":"application/vnd.osgeo.mapguide.package",".mrc":"application/marc",".mrcx":"application/marcxml+xml",".mxf":"application/mxf",".nbp":"application/vnd.wolfram.player",".ma":"application/mathematica",".mathml":"application/mathml+xml",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mscml":"application/mediaservercontrol+xml",".cdkey":"application/vnd.mediastation.cdkey",".mwf":"application/vnd.mfer",".mfm":"application/vnd.mfmp",".msh":"model/mesh",".mads":"application/mads+xml",".mets":"application/mets+xml",".mods":"application/mods+xml",".meta4":"application/metalink4+xml",".mcd":"application/vnd.mcd",".flo":"application/vnd.micrografx.flo",".igx":"application/vnd.micrografx.igx",".es3":"application/vnd.eszigno3+xml",".mdb":"application/x-msaccess",".asf":"video/x-ms-asf",".exe":"application/x-msdownload",".cil":"application/vnd.ms-artgalry",".cab":"application/vnd.ms-cab-compressed",".ims":"application/vnd.ms-ims",".application":"application/x-ms-application",".clp":"application/x-msclip",".mdi":"image/vnd.ms-modi",".eot":"application/vnd.ms-fontobject",".xls":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".chm":"application/vnd.ms-htmlhelp",".crd":"application/x-mscardfile",".lrm":"application/vnd.ms-lrm",".mvb":"application/x-msmediaview",".mny":"application/x-msmoney",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".obd":"application/x-msbinder",".thmx":"application/vnd.ms-officetheme",".onetoc":"application/onenote",".pya":"audio/vnd.ms-playready.media.pya",".pyv":"video/vnd.ms-playready.media.pyv",".ppt":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".mpp":"application/vnd.ms-project",".pub":"application/x-mspublisher",".scd":"application/x-msschedule",".xap":"application/x-silverlight-app",".stl":"application/vnd.ms-pki.stl",".cat":"application/vnd.ms-pki.seccat",".vsd":"application/vnd.visio",".vsdx":"application/vnd.visio2013",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wax":"audio/x-ms-wax",".wmx":"video/x-ms-wmx",".wmd":"application/x-ms-wmd",".wpl":"application/vnd.ms-wpl",".wmz":"application/x-ms-wmz",".wmv":"video/x-ms-wmv",".wvx":"video/x-ms-wvx",".wmf":"application/x-msmetafile",".trm":"application/x-msterminal",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".dotm":"application/vnd.ms-word.template.macroenabled.12",".wri":"application/x-mswrite",".wps":"application/vnd.ms-works",".xbap":"application/x-ms-xbap",".xps":"application/vnd.ms-xpsdocument",".mid":"audio/midi",".mpy":"application/vnd.ibm.minipay",".afp":"application/vnd.ibm.modcap",".rms":"application/vnd.jcp.javame.midlet-rms",".tmo":"application/vnd.tmobile-livetv",".prc":"application/x-mobipocket-ebook",".mbk":"application/vnd.mobius.mbk",".dis":"application/vnd.mobius.dis",".plc":"application/vnd.mobius.plc",".mqy":"application/vnd.mobius.mqy",".msl":"application/vnd.mobius.msl",".txf":"application/vnd.mobius.txf",".daf":"application/vnd.mobius.daf",".fly":"text/vnd.fly",".mpc":"application/vnd.mophun.certificate",".mpn":"application/vnd.mophun.application",".mj2":"video/mj2",".mpga":"audio/mpeg",".mxu":"video/vnd.mpegurl",".mpeg":"video/mpeg",".m21":"application/mp21",".mp4a":"audio/mp4",".mp4":"application/mp4",".m3u8":"application/vnd.apple.mpegurl",".mus":"application/vnd.musician",".msty":"application/vnd.muvee.style",".mxml":"application/xv+xml",".ngdat":"application/vnd.nokia.n-gage.data",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".ncx":"application/x-dtbncx+xml",".nc":"application/x-netcdf",".nlu":"application/vnd.neurolanguage.nlu",".dna":"application/vnd.dna",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".rpst":"application/vnd.nokia.radio-preset",".rpss":"application/vnd.nokia.radio-presets",".n3":"text/n3",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".ext":"application/vnd.novadigm.ext",".gph":"application/vnd.flographit",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".oda":"application/oda",".ogx":"application/ogg",".oga":"audio/ogg",".ogv":"video/ogg",".dd2":"application/vnd.oma.dd2+xml",".oth":"application/vnd.oasis.opendocument.text-web",".opf":"application/oebps-package+xml",".qbo":"application/vnd.intu.qbo",".oxt":"application/vnd.openofficeorg.extension",".osf":"application/vnd.yamaha.openscoreformat",".weba":"audio/webm",".webm":"video/webm",".odc":"application/vnd.oasis.opendocument.chart",".otc":"application/vnd.oasis.opendocument.chart-template",".odb":"application/vnd.oasis.opendocument.database",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".otg":"application/vnd.oasis.opendocument.graphics-template",".odi":"application/vnd.oasis.opendocument.image",".oti":"application/vnd.oasis.opendocument.image-template",".odp":"application/vnd.oasis.opendocument.presentation",".otp":"application/vnd.oasis.opendocument.presentation-template",".ods":"application/vnd.oasis.opendocument.spreadsheet",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".odt":"application/vnd.oasis.opendocument.text",".odm":"application/vnd.oasis.opendocument.text-master",".ott":"application/vnd.oasis.opendocument.text-template",".ktx":"image/ktx",".sxc":"application/vnd.sun.xml.calc",".stc":"application/vnd.sun.xml.calc.template",".sxd":"application/vnd.sun.xml.draw",".std":"application/vnd.sun.xml.draw.template",".sxi":"application/vnd.sun.xml.impress",".sti":"application/vnd.sun.xml.impress.template",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".sxg":"application/vnd.sun.xml.writer.global",".stw":"application/vnd.sun.xml.writer.template",".otf":"application/x-font-otf",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".dp":"application/vnd.osgi.dp",".pdb":"application/vnd.palm",".p":"text/x-pascal",".paw":"application/vnd.pawaafile",".pclxl":"application/vnd.hp-pclxl",".efif":"application/vnd.picsel",".pcx":"image/x-pcx",".psd":"image/vnd.adobe.photoshop",".prf":"application/pics-rules",".pic":"image/x-pict",".chat":"application/x-chat",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7m":"application/pkcs7-mime",".p7s":"application/pkcs7-signature",".p7r":"application/x-pkcs7-certreqresp",".p7b":"application/x-pkcs7-certificates",".p8":"application/pkcs8",".plf":"application/vnd.pocketlearn",".pnm":"image/x-portable-anymap",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pfr":"application/font-tdpfr",".pgn":"application/x-chess-pgn",".pgm":"image/x-portable-graymap",".png":"image/x-png",".ppm":"image/x-portable-pixmap",".pskcxml":"application/pskc+xml",".pml":"application/vnd.ctc-posml",".ai":"application/postscript",".pfa":"application/x-font-type1",".pbd":"application/vnd.powerbuilder6",".pgp":"application/pgp-signature",".box":"application/vnd.previewsystems.box",".ptid":"application/vnd.pvi.ptid1",".pls":"application/pls+xml",".str":"application/vnd.pg.format",".ei6":"application/vnd.pg.osasli",".dsc":"text/prs.lines.tag",".psf":"application/x-font-linux-psf",".qps":"application/vnd.publishare-delta-tree",".wg":"application/vnd.pmi.widget",".qxd":"application/vnd.quark.quarkxpress",".esf":"application/vnd.epson.esf",".msf":"application/vnd.epson.msf",".ssf":"application/vnd.epson.ssf",".qam":"application/vnd.epson.quickanime",".qfx":"application/vnd.intu.qfx",".qt":"video/quicktime",".rar":"application/x-rar-compressed",".ram":"audio/x-pn-realaudio",".rmp":"audio/x-pn-realaudio-plugin",".rsd":"application/rsd+xml",".rm":"application/vnd.rn-realmedia",".bed":"application/vnd.realvnc.bed",".mxl":"application/vnd.recordare.musicxml",".musicxml":"application/vnd.recordare.musicxml+xml",".rnc":"application/relax-ng-compact-syntax",".rdz":"application/vnd.data-vision.rdz",".rdf":"application/rdf+xml",".rp9":"application/vnd.cloanto.rp9",".jisp":"application/vnd.jisp",".rtf":"application/rtf",".rtx":"text/richtext",".link66":"application/vnd.route66.link66+xml",".shf":"application/shf+xml",".st":"application/vnd.sailingtracker.track",".svg":"image/svg+xml",".sus":"application/vnd.sus-calendar",".sru":"application/sru+xml",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".see":"application/vnd.seemail",".snf":"application/x-font-snf",".spq":"application/scvp-vp-request",".spp":"application/scvp-vp-response",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".sdp":"application/sdp",".etx":"text/x-setext",".movie":"video/x-sgi-movie",".ifm":"application/vnd.shana.informed.formdata",".itp":"application/vnd.shana.informed.formtemplate",".iif":"application/vnd.shana.informed.interchange",".ipk":"application/vnd.shana.informed.package",".tfi":"application/thraud+xml",".shar":"application/x-shar",".rgb":"image/x-rgb",".slt":"application/vnd.epson.salt",".aso":"application/vnd.accpac.simply.aso",".imp":"application/vnd.accpac.simply.imp",".twd":"application/vnd.simtech-mindmapper",".csp":"application/vnd.commonspace",".saf":"application/vnd.yamaha.smaf-audio",".mmf":"application/vnd.smaf",".spf":"application/vnd.yamaha.smaf-phrase",".teacher":"application/vnd.smart.teacher",".svd":"application/vnd.svd",".rq":"application/sparql-query",".srx":"application/sparql-results+xml",".gram":"application/srgs",".grxml":"application/srgs+xml",".ssml":"application/ssml+xml",".skp":"application/vnd.koan",".sgml":"text/sgml",".sdc":"application/vnd.stardivision.calc",".sda":"application/vnd.stardivision.draw",".sdd":"application/vnd.stardivision.impress",".smf":"application/vnd.stardivision.math",".sdw":"application/vnd.stardivision.writer",".sgl":"application/vnd.stardivision.writer-global",".sm":"application/vnd.stepmania.stepchart",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".sdkm":"application/vnd.solent.sdkm+xml",".xo":"application/vnd.olpc-sugar",".au":"audio/basic",".wqd":"application/vnd.wqd",".sis":"application/vnd.symbian.install",".smi":"application/smil+xml",".xsm":"application/vnd.syncml+xml",".bdm":"application/vnd.syncml.dm+wbxml",".xdm":"application/vnd.syncml.dm+xml",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".sbml":"application/sbml+xml",".tsv":"text/tab-separated-values",".tiff":"image/tiff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcl":"application/x-tcl",".tex":"application/x-tex",".tfm":"application/x-tex-tfm",".tei":"application/tei+xml",".txt":"text/plain",".dxp":"application/vnd.spotfire.dxp",".sfs":"application/vnd.spotfire.sfs",".tsd":"application/timestamped-data",".tpt":"application/vnd.trid.tpt",".mxs":"application/vnd.triscape.mxs",".t":"text/troff",".tra":"application/vnd.trueapp",".ttf":"application/x-font-ttf",".ttl":"text/turtle",".umj":"application/vnd.umajin",".uoml":"application/vnd.uoml+xml",".unityweb":"application/vnd.unity",".ufd":"application/vnd.ufdl",".uri":"text/uri-list",".utz":"application/vnd.uiq.theme",".ustar":"application/x-ustar",".uu":"text/x-uuencode",".vcs":"text/x-vcalendar",".vcf":"text/x-vcard",".vcd":"application/x-cdlink",".vsf":"application/vnd.vsf",".wrl":"model/vrml",".vcx":"application/vnd.vcx",".mts":"model/vnd.mts",".vtu":"model/vnd.vtu",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".ccxml":"application/ccxml+xml,",".vxml":"application/voicexml+xml",".src":"application/x-wais-source",".wbxml":"application/vnd.wap.wbxml",".wbmp":"image/vnd.wap.wbmp",".wav":"audio/x-wav",".davmount":"application/davmount+xml",".woff":"application/x-font-woff",".wspolicy":"application/wspolicy+xml",".webp":"image/webp",".wtb":"application/vnd.webturbo",".wgt":"application/widget",".hlp":"application/winhlp",".wml":"text/vnd.wap.wml",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wpd":"application/vnd.wordperfect",".stf":"application/vnd.wt.stf",".wsdl":"application/wsdl+xml",".xbm":"image/x-xbitmap",".xpm":"image/x-xpixmap",".xwd":"image/x-xwindowdump",".der":"application/x-x509-ca-cert",".fig":"application/x-xfig",".xhtml":"application/xhtml+xml",".xml":"application/rss+xml",".xdf":"application/xcap-diff+xml",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".rl":"application/resource-lists+xml",".rs":"application/rls-services+xml",".rld":"application/resource-lists-diff+xml",".xslt":"application/xslt+xml",".xop":"application/xop+xml",".xpi":"application/x-xpinstall",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xyz":"chemical/x-xyz",".yaml":"text/yaml",".yang":"application/yang",".yin":"application/yin+xml",".zir":"application/vnd.zul",".zip":"application/zip",".zmm":"application/vnd.handheld-entertainment+xml",".zaz":"application/vnd.zzazz.deck+xml",".atom":"application/atom+xml",".jpeg":"image/jpeg",".jpg":"image/jpeg",".rss":"application/rss+xml"}
to a file on your server called mimeTypes.json (for example), read it with var mimes = require("mimeTypes.json"), then before res.end simply do
var extension = req.url.substring(
req.
url.lastIndexOf(".")
);
var type = mimes[extension];
if(type) {
req.setHeader("content-type", type);
}
P.S.
The JSON was parsed from the JavaScript console from the link above. In case of changes, simply run the following in your console at that page to get the new JSON:
var j =
Array.apply(
null,
document
.getElementsByTagName("table")[0].rows
).map(x => [
x.cells[2].innerText,
x.cells[1].innerText
]).slice(1)
.filter(x=>
!x[1].includes("x-citrix-jpeg")
)
j.forEach(x => {
x[0].indexOf(",") > -1 && (
x[0].split(",").forEach(y =>
j.push([y.trim(), x[1]])
)
)
})
j = Object.fromEntries(
j.filter(x=>
x[0].indexOf(",") === -1
)
);
I had problems using your handler function because convertURL and okURL functions where not defined. I modified the code a little and finished looking like this
function handler(req, res)
{
// /home/juan/Documentos/push-api-demo is the path of the root directory of the server
var url = '/home/juan/Documentos/push-api-demo' + req.url;
var file_exists = fs.existsSync(url);
if (file_exists)
{
fs.readFile(url, function(err, data)
{
if (err)
{
res.writeHead(404);
return res.end("File not found.");
}
res.setHeader("Content-Type", mime.lookup(url));
res.writeHead(200);
res.end(data);
});
}
else
{
res.writeHead(403);
return res.end("Forbidden.");
}
}

Categories

Resources