Skip to content

Instantly share code, notes, and snippets.

@guibranco
Last active October 3, 2016 19:27
Show Gist options
  • Save guibranco/cca1306afafcaa046bf6370e187c3a79 to your computer and use it in GitHub Desktop.
Save guibranco/cca1306afafcaa046bf6370e187c3a79 to your computer and use it in GitHub Desktop.
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&atilde;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&atilde;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