Как хранить файлы на сервере в чистом Node.js? - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь записать на диск загруженный файл POST внутри формы с атрибутом enctype = "multipart / form-data", и я получаю данные на сервере и мне удалось их отсортировать (получить содержимое внутри файла и имени файла ), но когда я пишу на диск, файл не читается. Эти изображения могут проиллюстрировать мою ситуацию. Image1 показывает, как я получаю данные, и image2 показывает, как они отображаются. Я не знаю, что случилось.

Я использую trid-кодирование в виде base64, двоичное, и я не кодирую его, отправляя прямо, как это происходит из формы, но безуспешно.

Изображение 1 http://es.tinypic.com/view.php?pic=sou610&s=9#.XRuig-tKiUk Изображение 2 http://es.tinypic.com/view.php?pic=11jag49&s=9#.XRujROtKiUk

Файл сохраняется на сервере, но недоступен для чтения. Надеюсь, мне удастся получить файл на сервере так же, как он загружен.

if(request_param.method == "POST")
{
	var qs = require('querystring');
	var body = '';

	request_param.on('data', function(data)
	{
		body += data; //gets incoming data on buffer
	});

	request_param.on('end', function()
	{
		var util = require('util');
		var postvars_array = qs.parse(body);

		var boundary = body.substring(0, 40); //gets the boundary
		var line_separator = "\r\n";
		var array_post_fields = body.split(boundary);

		var array_post_field;
		var field_header_array;
		var file_content;
		var file_name;
		var file_name_arr;
		var file_ext;
		var file_ext_arr;

		for(f = 1; f < array_post_fields.length; f++) //parses the string from multipart form
		{
			array_post_field = array_post_fields[f].split(line_separator);
			field_header_array = array_post_field[1].split(";");
			if(field_header_array.length > 2)
			{
				file_name = field_header_array[2]; //gets filename
				file_name_arr = file_name.split("=");
				file_name = file_name_arr[1];
				file_name = file_name.replace('"', '');
				file_name = file_name.replace('"', '');
				file_content = array_post_field[4]; //gets file contents
			}
		}
		
		cont += '<br/><br/>';
		cont += '<br/><br/>';
		cont += file_name + '<br/><br/>' + file_content; //prints file contents, lots of diamonds (question signs)

		file_ext_arr = file_name.split(".");
		file_ext = file_ext_arr[file_ext_arr.length - 1];
		
		if(file_name != "")
		{
			const fs = require('fs');
			fs.writeFile("./shared/"+file_formats[file_ext]+"/"+file_name, file_content, function(err) //writes on disk (file gets saved but its unreadable)
			{
				if(err)
					return console.log(err);

				var fs = require('fs');
				fs.readFile("./media/text/template.html", 'utf8', function(err, contents)
				{
					if(err)
						console.log(err);
					cont = contents.replace("<hydra-html-content>", cont);
					cont = cont.replace("<hydra-module-name>", "Archivos");
					cont = cont.replace("<hydra-title-page>", ".:Hydra / Archivos:.");

					response_param.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
					response_param.write(cont);
					response_param.end();
				});
			});
		}
		else
		{
			var fs = require('fs');
			fs.readFile("./media/text/template.html", 'utf8', function(err, contents)
			{
				if(err)
					console.log(err);
				cont = contents.replace("<hydra-html-content>", cont);
				cont = cont.replace("<hydra-module-name>", "Archivos");
				cont = cont.replace("<hydra-title-page>", ".:Hydra / Archivos:.");

				response_param.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
				response_param.write(cont);
				response_param.end();
			});
		}
	});
}
...