1. Вступительный анализ
Модуль файловой системы - это простой упакованный набор стандартных методов работы/вывода файла POSIX. Модуль может быть получен путем вызова требований («FS»). Все методы в модуле файловой системы доступны в асинхронных и синхронных версиях.
(1) Асинхронный метод в модуле файловой системы требует завершенной функции обратного вызова в качестве последнего входящего формального параметра.
(2) Композиция функции обратного вызова определяется асинхронным методом вызываемого. Как правило, первым формальным параметром функции обратного вызова является возвращаемое сообщение об ошибке.
(3) Если асинхронная операция выполняется правильно и возвращается, формальный параметр ошибки нулевой или не определен. Если вы используете синхронную версию метода операции, после возникновения ошибки в обычной форме ошибки будет возвращена ошибка.
(4) Вы можете использовать операторы «Попробуй и поймать» для перехвата ошибок и сделать программу продолжать.
Давайте сначала посмотрим на простой пример, прочитайте файл ("bb.txt"):
(1) Создайте файл «bb.txt», следующим образом («Привет всем, я - НОБИТА! (*^__^*) хе -хе ...»).
(2), прочитайте операцию файла следующим образом:
Кода -копия выглядит следующим образом:
var fs = require ("fs");
fs.readfile ("bb.txt", "utf8", function (ошибка, данные) {
if (ошибка) ошибки бросает;
console.log (data);
});
Результаты работы:
Вам нужно отметить здесь: вы должны установить кодирование при чтении файлов, в противном случае форма по умолчанию будет отображаться в «буфере».
Глядя на эффект бега, который не установлен, разница все еще очень очевидна. следующее:
Еще одна операция записи, следующим образом:
Кода -копия выглядит следующим образом:
var fs = require ("fs");
var txt = "Каждый должен изучить nodejs !!!" ;
// записать в файл
fs.writefile ("bb.txt", txt, function (err) {
if (err) бросить ошибку;
console.log ("файл сохранил!"); // файл сохраняется
});
Результаты работы:
Вот несколько распространенных примеров:
Кода -копия выглядит следующим образом:
// удалить файл
fs.unlink ('bb.txt', function () {
console.log («успех»);
});
// Измените имя файла
fs.rename ('bb.txt', 'bigbear.txt', function (err) {
console.log ('переименовать успех');
});
// Проверка статуса файла
fs.stat ('bb.txt', function (err, stat) {
console.log (stat);
});
// определить, существует ли файл
fs.exists ('bb.txt', function (существует) {
console.log (существует);
});
2. Связь между FS и потоком
«Поток» имеет асинхронные особенности. Могу ли я разделить файл или кусок контента на неизвестные «куски» и прочитать его, и каждый раз, когда читается «кусок», мы вынимаем его. Пока файл не будет закончен. Это похоже на «Кодирование передачи: Chunked», поддерживаемое «http1.1». («Чанк» может существовать в любой форме, Nodejs существуют в форме «буфера» по умолчанию, что более эффективно). «Поток» в Nodejs имеет супер-функцию в системах UNIX, то есть («труба» ------ трубопровод).
Вы все еще помните первую программу Nodejs «Привет, Big Bear!»? Мы делаем некоторые модификации на основе апплета следующим образом:
(1), создать "bb.html"
Кода -копия выглядит следующим образом:
<html>
<голова>
<стиль типа = "text/css">
div {
маржинальная версия: 50px;
Ширина: 100%;
поля: 0px;
Высота: 120px;
высота линии: 120px;
Цвет: #ffff;
размер шрифта: 22px;
Фон:#FF9900;
Текст-альбом: Центр;
}
</style>
</head>
<тело>
<div> Привет, Большой Медведь! </div>
</body>
</html>
(2), измените предыдущую программу следующим образом:
Кода -копия выглядит следующим образом:
var http = require ('http');
var fs = require ("fs");
var server = http.createserver (function (req, res) {
fs.readfile ("bb.html", "utf-8", function (err, data) {
if (err) {
res.writehead (500, {'контекст-тип': 'text/plain'});
res.end ('Укажите файл, не существует! Или ошибка сервера!');
}
еще{
res.writehead (200, {'контекст-тип': 'text/html'});
res.write (data);
res.end ();
}
})
});
Server.Listen (8888);
console.log ("http -сервер, работающий на порту 8888 ...");
Ниже приведены результаты работы:
Теперь нам нужно подумать об этом, если мы отправляем не простой текстовый файл, а файл гипермедиа, такой как видеофайл Full HD на конференции Google 2014 IO. Формат MP4. Длина более 2 часов 1080p.
Около 4 ГБ. Известно, что «Readfile» работает, - это читать файлы в память. Тогда такой большой файл, очевидно, не может быть сделан. Так что мне делать? После этого вам нужно использовать поток, чтобы сделать это. Вот и все.
Код заключается в следующем:
Кода -копия выглядит следующим образом:
fs.createreadStream (__ dirname + '/vedio.mp4').pipe(res);
Суммировать:
Эти коды могут реализовать требуемые функции, но служба должна кэшировать все данные файла в память перед отправкой данных файла, если файл "bb.html" очень
Если он большой и имеет большую параллелизм, много памяти будет потрачено впустую. Поскольку пользователю необходимо подождать, пока весь файл кэшируется в памяти, чтобы принять данные файла, это приводит к
Пользовательский опыт довольно плохой. К счастью, оба параметра "(req, res)" являются потоком, поэтому мы можем использовать fs.createreadstream () вместо "fs.readfile ()".
Три, примеры
Приходите загрузить файл:
(1) Создать "server.js"
Кода -копия выглядит следующим образом:
var http = require ('http');
var url = require ('url');
Function Start (маршрут, обработчик) {
функция OnRequest (запрос, ответ) {
var pathname = url.parse (request.url) .pathname;
// маршрут к соответствующей бизнес -логике
маршрут (Pathname, обработчик, ответ, запрос);
}
http.createserver (onrequest) .listen (3000);
console.log ('сервер начинается');
}
exports.start = start;
(2) Создать "route.js"
Кода -копия выглядит следующим образом:
маршрут функции (PathName, Handler, ответ, запрос) {
console.log ('ate to Rake aeprest for' + pathname);
if (typeof handler [pathname] === 'function') {
return handler [pathname] (ответ, запрос);
} еще {
console.log ('Нет обработчика запроса, не найденный для' + pathname);
response.writehead (404, {'content-type': 'text/html'});
response.write ('404 не найден!');
response.end ();
}
}
exports.route = route;
(3) Создать "requestHandler.js"
Кода -копия выглядит следующим образом:
var QueryString = require ('QueryString'),
fs = require ('fs'),
Commudable = require ('Commidable');
function start (ответ, запрос) {
console.log ('start module');
var body = '<html>'+
'<head>'+
'<meta http-equiv = "content-type"'+
'content = "text /html; charset = utf-8" />'+
'</head>'+
'<body>'+
'<form action = "/upload" ectype = "multipart/form-data" method = "post">'+
'<input type = "file" name = "upload" multy = "multy">'+
'<input type = "Отправить" value = "Отправить текст" />'+
'</form>'+
'</body>'+
'</html>';
response.writehead (200, {'' content-type ':' text/html '});
response.write (тело);
response.end ();
}
Загрузка функции (ответ, запрос) {
console.log ('upload module');
var form = new Formidable.indomingForm ();
form.parse (запрос, функция (ошибка, поля, файлы) {
fs.renamesync (files.upload.path, '/tmp/test.png');
response.writehead (200, {'' content-type ':' text/html '});
response.write ('you /' ve отправил: <br /> ');
response.write ('<img src = " /show" />');
response.end ();
});
}
Функция Show (ответ, запрос) {
console.log ('Show Module');
fs.readfile ('/tmp/test.png', 'Binary', function (ошибка, файл) {
if (ошибка) {
response.writehead (200, {'' content-type ':' text/html '});
response.write (ошибка);
response.end ();
} еще {
response.writehead (200, {'' content-type ':' image/png '});
response.write (файл, «двоичный»);
response.end ();
}
});
}
exports.start = start;
exports.upload = upload;
exports.show = show;
(4) Создать "index.js"
Кода -копия выглядит следующим образом:
var server = require ('./ server');
var router = require ('./ router');
var requestHandler = require ('./ requestHandler');
var formidable = require ('стерент'); // Требуется алгоритм поиска пути? ?
var handler = {};
Handler ['/'] = requestHandler.start;
Handler ['/start'] = requestHandler.start;
Handler ['/upload'] = requestHandler.upload;
Handler ['/show'] = requestHandler.show;
Server.Start (Router.Route, Handler);
Четыре, давайте обобфрим
(1) Понять «связь между FS и потоком».
(2) Опытный в использовании API-обработанных API, связанных с «FS».
(3) Обратите внимание на детали, такие как: данные обработки между методом синхронизации API файла API и асинхронным методом.
(4), и, наконец, подчеркните: понимать метод организации кода в примерах загрузки файлов, постоянно рефактор и постоянно суммируйте.