Возврат файла в ответе HTTP

Я новичок в Node JS и был бы признателен за любую помощь/совет.

Используя NodeJS, я создал локальный сервер, запускающий эту ссылку (это просто привет мир)

Оттуда я использовал этот фрагмент переполнения стека, который отвечает типом сделанного запроса.

Я хотел бы пойти дальше, и когда reponse.method — это get/post/etc. — Я бы хотел, чтобы ответ был файлом.

Другими словами, я хотел бы вернуть файл из HTTP-ответа.

Теоретически, что-то вроде:

  if (request.method == "GET") {response.end ("C:  [путь к файлу]  test.txt")  ;}  

Я пробовал просто скопировать/вставить каталог с файлами после response.end (‘каталог файлов’), но не открывал нужный файл.

  const http = require ("http"); const hostname = '127.0.0.1'; const port = 8091; var server = http.createServer (function (request, response) {  response.writeHead (200, {"Content-Type": "text  plain"}); if (request.method == "GET") {response.end ("получил запрос GET.")} else if (request.  method == "POST") {response.end ("получен запрос POST.");} else {response.end ("Неопределенный запрос.");}}); server.listen (порт, имя хоста, () =>  {console.log (`Сервер работает по адресу http://$ {hostname}: $ {port}/`);});  

Вы можете отправить данные файла, сначала прочитав файл с помощью метод readFile модуля fs , а затем отправьте его через res.write () , за которым следует res.end () или просто res.end () , как вы это сделали. Вот пример:

  var http = require ('http'); var url = require ('url'); var fs = require ('fs'); http.  createServer (function (req, res) {if (req.method === 'GET' && req.url === '/') {fs.readFile ('./index.html', function (err, data)  {if (err) {throw err;} res.writeHead (200, {'Content-Type': 'text/html'}); res.end (data); return;});}}). listen (3000  );  

Я ответил на аналогичный вопрос здесь: https://stackoverflow.com/a/56285824/4882724



Как правильно передать файл с помощью HTTP-ответа?

Я пытаюсь создать простой веб-сервер, способный передавать файлы.
Я знаю, есть много примеров, но большинство из них слишком сложны для понимания тем, кто никогда не работал с HTTP
Так что у меня есть …

   public Hashtable MimeTypes = new Hashtable ();  общедоступный HttpServer (int порт) {this.port = порт;  MimeTypes.Add («HTML», «текст/HTML»);  MimeTypes.Add ("htm", "текст/html");  MimeTypes.Add («css», «текст/css»);  MimeTypes.Add («js», «приложение/x-javascript»);  MimeTypes.Add («png», «изображение/png»);  MimeTypes.Add («gif», «image/gif»);  MimeTypes. Добавить ("jpg", "изображение/jpeg");  MimeTypes.Add ("JPEG", "изображение/JPEG");  } public void writeSuccess (строка mime_type, строка file_name, int file_size) {outputStream.Write ("HTTP/1.0 200 OK  n");  outputStream.Write ("Content-Type:" + mime_type + " n");  if (file_name! = null)//если имя файла не равно null, это означает, что нам нужно добавить дополнительные заголовки {outputStream.Write ("Content-Disposition: attachment; filename =" + file_name);  outputStream.Write ("Длина содержимого:" + размер_файла);  } outputStream.Write ("Соединение: закрыть  n");  outputStream.Write (" п");  } общедоступное переопределение void handleGETRequest (HttpProcessor p) {Console.WriteLine ("запрос: {0}", p.http_url);  байт [] file_content = null;  попробуйте {file_content = File.ReadAllBytes (work_folder + p.http_url);  }//попытка чтения запрошенного файла catch (Exception exc) {p.writeFailure ();  возвращение;  }//возвращаем ошибку, если такого файла нет string [] splitted_html_url = p.http_url.Split (new char [] {'.'}, StringSplitOptions.RemoveEmptyEntries); //разделение URL для будущей проверки формата string mime_type = "application/octet-stream"; //наиболее общий тип if (MimeTypes.Contains (split_html_url [split_html_url.Length - 1])) mime_type = (string) MimeTypes [split_html_url [splitted_html_url.Length - 1]]; //установить mimy type, который математически соответствует запрошенному формату файла if (mime_type.Contains ("image") || mime_type == "application/octet-stream")//хакерская штука для тестов ... p.writeSuccess (mime_type, p  .http_url.Remove (0, 1), file_content.Length); //если тип mime - изображение или неизвестен, то передайте имя и длину файла конструктору ответов else p.writeSuccess (mime_type, null, 0); //иначе просто добавьте общие заголовки p.outputStream.Write (Encoding.ASCII.GetString (file_content)); //записываем содержимое файла после заголовков}  

Он работает для передачи HTML, но я не могу заставить его передавать изображения: (
Если я сделаю html-страницу с этим тег:

  

и поместите этот файл в правый каталог, он все еще отображается в браузере как отсутствующий файл


Я думаю, вы делаете несколько ошибок.

  • Вы предполагаете, что можете избежать всей сложности примера кода.
  • Вместо того, чтобы вставлять свой код и заставлять кого-то выполнять вашу работу, вы должны изучить HTTP — он не должен быть слишком сложным для объема вашей задачи.
  • Вы пишете код, чтобы сделать что-то, что может быть сделано с помощью IIS, который запускает ваш код (если вы запускаете свой код в IIS)
  • Вы пишете файл как строку с p.outputStream.Write (Encoding.ASCII.GetString (file_content));//записываем содержимое файла после заголовков

Я предлагаю:

  • Не используйте CodeProj пример, который вы используете;
  • Попробуйте проект ServiceStack (возможно, вы захотите прочитать ServiceStack и вернуть поток)
Оцените статью
logicle.ru
Добавить комментарий