Nodejs обрабатывает загрузку файла
В Express4 req.files был undefined ; Наиболее используемый сейчас может быть formidable . Вы знаете, что у него есть событие progress , так что вы очень рады. Прогресс -панель нижней версии IE - шанс; ОК, попробуйте:
form .on ('error', function (err) {console.log (err);}) .on ('Aborted', function () {console.log ('aborted');}) n = parseint (parsefloat (bytesreceived/bytesexpred) .tofixed (2)*100);Да, вы рады видеть, что консоль печатает череду значений прогресса, как и ожидалось; Затем иди дальше;
form .on ('progress', function (bytesreceived, bytesexprected) {var n = parseint (parsefloat (bytesreceived/bytexprected) .tofixed (2)*100); res.write ('<cript> window.parent.call ('+n+') <//script>'); }); Метод call должен отобразить значение прогресса на странице; К сожалению, вы можете увидеть только последние 100%, и вы не можете увидеть конкретное подробное значение прогресса, загруженное; Изучите еще раз ...
Далее, давайте изменим идею, попробуем ее, сохраните значение прогресса в session и добавим дополнительный запрос, чтобы опросить стоимость прогресса. О, это неплохо! Чтобы гарантировать, что значение прогресса, которое вы запрашиваете, является значением прогресса, которое вы загружаете на этот раз, а не значение прогресса других загрузок, вам необходимо согласиться с значением token в загруженном запросе и в дополнительном запросе; Теперь еще один вопрос заключается в том, как получить этот token при запросе. Поскольку тело запроса загрузки файла находится в Request Payload , req.body не может получить принесенное им значение, и я не хочу анализировать эту кучу, конечно, я тоже не могу его проанализировать; Лучше всего поместить это в url , проблема в том, что иногда вам приходится дважды освежить, чтобы освежить token , что не очень хорошо! В качестве последнего средства я положу его в cookie !
var cookies = function () {var cks = req.headers.cookie.split (';'), obj = {}; for (var i = 0; i <cks.length; i ++) {obj [cks [i] .split ('=') [0] .replace (// s+/ig, '')] = unescape (cks [i] .split ('=') [1]); } вернуть obj; } (); var QueryToken = cookie .__ Token__; form .on ('progress', function (bytesreceived, bytesexprected) {var n = parseint (parsefloat (form.bytesreceived/form.bytexprected) .tofixed (2)*100); if (req.session ['file'+querytoken] {req.session ['file'+queryt querytoden = n; req.session ['file'+Querytoken] = {token: Querytoken, процент: n}};Для IE789 я пришел на опрос для оценки прогресса. Я прощаю меня, но мое сердце болит;
var getData = function () {$ .post ('/uploader', {getFileInfo: 1, uploadToken: utils.cookie.getCookie ('__ token__')}) .then (function (data) {console.log (data); if (data.mes <0) {getData (); Call (Prose.Percent); } getData (); Метод call должен отобразить значение прогресса на странице; К сожалению, вы можете увидеть только последние 100%, и вы не можете увидеть конкретное подробное значение прогресса, загруженное; Изучите еще раз ...
Хорошо, я снова впал в это; Но я все еще чувствую, что что -то не так, нет проблем с опросом Ajax. Проблема заключается в том, что session должен ждать, пока загрузка не будет завершена, прежде чем она будет иметь значение, поэтому я могу видеть только 100%, и я не вижу подробного значения прогресса; Могу ли я подумать, что в процессе предыдущего res.write и этого req.session были приостановлены, но это экономит результаты каждого исполнения до тех пор, пока не будет выпущен progress , поэтому я могу видеть только 100%; Я не в настроении читать исходный код formidable , конечно, я не могу его понять, поэтому я думаю, что сначала!
Поскольку опрос ajax в порядке, его нелегко сохранить на session . Если это действительно не работает, попробуйте это в global . Он не сможет внести ценность в глобальный объект, и он повесит его. Если это внесет небольшое изменение, это будет помещено в global :
form .on ('progress', function (bytesreceived, bytesexprected) {var n = parseint (parsefloat (form.bytesreceived/form.bytexprected) .tofixed (2)*100); if (global ['file'+Querytoken]) {global ['file'+QueryToken]. Global ['file'+Querytoken] = {token: Querytoken, процент: n}};Продолжить опрос.
Красиво, вот и все! То, что я вижу в Chrome, такое же, как и прогресс HTML5, но он будет немного застрять в IE789, но вы все еще можете увидеть подробную ценность прогресса; В конце концов, старые браузеры не хороши, вы знаете; И каждый раз, когда вы загружаете, вы вкладываете ценность в global , поэтому вам приходится чистить ее надлежащим образом. После загрузки файла вы можете перенести его в указанный global['file'+queryToken]=null ;
Тем не менее, опрос означает много запросов один за другим, и здесь могут возникнуть проблемы; Если вы не ограничиваете его, значение прогресса запрашивается один раз каждые 500 мс интервала; Что ж, так же решет, как это решается IE789, и он согласен выбросить Flash; Хотя этот опрос совместим со всеми браузерами, он все еще является пустой тратой многих запросов. Давайте вынесем решение, продолжите HTML5 за пределами IE789!
На самом деле, если вы измеряете это, какой из них более достойный, плюс одна вспышка или дополнительный запрос? Прости меня за то, что я не понял Флэш, я не скажу много. В любом случае, я не люблю добавлять дополнительные файлы на страницу;
Суммировать
Есть еще много подробностей о компонентах загрузки файла. Первоначально я хотел сделать файл JS, но позже я подумал, что для того, чтобы быть более повторным использованием, было бы лучше сделать это как независимая страница. Если вам нужно загрузить его, просто iframe, что определенно намного лучше, чем создание файла JS. Вышеуказанное - все содержание этой статьи. Я надеюсь, что это может помочь вам в учебе или на работе. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения.