Last active
October 3, 2016 19:27
-
-
Save guibranco/cca1306afafcaa046bf6370e187c3a79 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var http = require('http'); | |
var fs = require('fs'); | |
var url = require('url'); | |
var path = require('path') | |
http.createServer(function(req, res) { | |
//res.writeHead(200,{"Content-Type":"text/html"}); --> Não informe ao navegador um statusCode 200 se você ainda não sabe o que vai acontecer abaixo... | |
var uri = url.parse(req.url).pathname; //usamos a biblioteca url! | |
var filename = path.join(process.cwd(), uri); //mapeamos o caminho solicitado para o caminho onde a aplicação está sendo executada. Por exemplo: | |
//http://localhost:3000/images/image.png vira c:\node\projetoTeste\images\image.png. VOcê precisa mapear o arquivo pro fileSystem para poder abrir e servir o binário! | |
console.log(uri); | |
if (uri == "/criar") { // http://localhost:3000/criar | |
fs.readdir('./arquivos', function(error, files) { | |
//Se ocorrer um erro... | |
if (error) { | |
res.writeHead(500, { "Content-Type": "text/html" }); //Mandandoms HTTP 500 pro navegador e uma mensagem de erro no corpo do HTML | |
res.write("<html></body><h1>HTTP - 500</h1><p>Erro: " + error + "</p></body></html>"); | |
res.end(); | |
return; | |
} | |
//tudo OK, vamos informar código 200 (OK) pro navegador! | |
res.writeHead(200, { "Content-Type": "text/html" }); | |
//agora é a hora de liberar a tag HTML e BODY, não dentro do loop! | |
res.write("<html><body>"); | |
for (var i = 0; i < files.length; i++) { | |
var current = files[i]; | |
if (current.indexOf(".txt") != -1) { | |
console.log(current + " é um arquivo txt"); | |
res.write("<img src='images/txt.png' alt='txt file' width='24' height='24' /><a href='/ler/" + current + "'>" + current + "</a><br />\r\n"); //exibimos cada arquivo .txt em uma linha! | |
} | |
else if (current.indexOf(".html") != -1) | |
{ | |
console.log(current + " é um arquivo html"); | |
res.write("<img src='images/html.png' alt='html file' width='24' height='24' /><a href='/ler/" + current + "'>" + current + "</a><br />\r\n"); //exibimos cada arquivo .html em uma linha! | |
} | |
else if (current.indexOf(".pdf") != -1) | |
{ | |
console.log(current + " é um arquivo pdf"); | |
res.write("<img src='images/pdf.png' alt='pdf file' width='24' height='24' /><a href='/ler/" + current + "'>" + current + "</a><br />\r\n"); //exibimos cada arquivo .pdf em uma linha! | |
} | |
else | |
console.log(current + " não é TXT, nem HTML e nem PDF!!!"); | |
} | |
res.write("</body></html>"); //terminamos a marcação HTML da resposta. | |
res.end(); //fechamos a resposta | |
}); | |
} | |
else if(uri.indexOf("/ler") != -1) | |
{ | |
var file = decodeURI(uri.replace("/ler/","")); | |
console.log("Acessando arquivo em arquivos: " + file); | |
filename = path.join(process.cwd(),"/arquivos/",file); | |
console.log(filename); | |
fs.exists(filename, function(exists){ | |
if(!exists) | |
{ | |
console.log(filename + " não existe"); | |
res.writeHead(404, { "Content-Type": "text/html" }); | |
res.write("<html></body><h1>HTTP - 404</h1><p>Erro: " + filename + " não foi encontrado!</p></body></html>"); | |
res.end(); | |
return; | |
} | |
fs.readFile(filename, "binary", function(error, fileData) { | |
//Erro de I/O, o arquivo na existe, não tem permissão para ler, está bloqueado, qualquer erro... | |
if (error) { | |
console.log("Erro ao ler: " + filename); | |
res.writeHead(500, { "Content-Type": "text/html" }); //Mandandoms HTTP 500 pro navegador e uma mensagem de erro no corpo do HTML | |
res.write("<html></body><h1>HTTP - 500</h1><p>Erro: " + error + "</p></body></html>"); | |
res.end(); | |
return; | |
} | |
var header = "text/plain"; | |
if(filename.indexOf(".pdf") != -1) | |
header = "application/pdf"; | |
else if(filename.indexOf(".html") != -1) | |
header = "text/html"; | |
res.writeHead(200, { "Content-Type": header}); //HTTP 200 pro navegador | |
res.write(fileData, "binary"); //mandamos o arquivo de forma binária pro navegador | |
res.end(); //fechamoss a resposta | |
}); | |
}); | |
} else { | |
// qualquer outra coisa, sem ser http://localhost:3000/criar vem para cá! É aqui que você vai fazer o node exibir a imagem pro navegador | |
console.log("Estamos acessando o arquivo: " + filename); | |
fs.exists(filename, function(exists) { //verificamos primeiro se o arquivo existe no FileSystem do servidor | |
if (!exists) { //a URL solicitada não aponta para nenhum arquivo real no disco...mandamos um 404 pro navegador | |
console.log(filename + " não existe"); | |
res.writeHead(404, { "Content-Type": "text/html" }); | |
res.write("<html></body><h1>HTTP - 404</h1><p>Erro: " + filename + " não foi encontrado!</p></body></html>"); | |
res.end(); | |
return; | |
} | |
if (fs.statSync(filename).isDirectory()) // ser for um diretório (AKA pasta) exibimos o arquiov index.html (se não existir vai gerar um erro 500) | |
filename += "/index.html"; | |
fs.readFile(filename, "binary", function(error, fileData) { | |
//Erro de I/O, o arquivo na existe, não tem permissão para ler, está bloqueado, qualquer erro... | |
if (error) { | |
console.log("Erro ao ler: " + filename); | |
res.writeHead(500, { "Content-Type": "text/html" }); //Mandandoms HTTP 500 pro navegador e uma mensagem de erro no corpo do HTML | |
res.write("<html></body><h1>HTTP - 500</h1><p>Erro: " + error + "</p></body></html>"); | |
res.end(); | |
return; | |
} | |
//AQUI ESTÁ O "TRUQUE" | |
res.writeHead(200); | |
res.write(fileData, "binary"); //mandamos o arquivo de forma binária pro navegador | |
res.end(); //fechamoss a resposta | |
}); | |
}) | |
} | |
}).listen(process.env.PORT || 3000, function() { | |
console.log("Servidor rodando!"); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment