Nodejs는 파일 업로드를 처리합니다
Express4에서, req.files는 undefined 되지 않았다; 가장 많이 사용되는 것은 이제 formidable 할 수 있습니다. 당신은 그것이 progress 상황이 있다는 것을 알고 있으므로 당신은 너무 기뻐합니다. IE의 하위 버전의 진행 막대는 기회입니다. 좋아, 시도해보십시오.
form .on ( 'error', function (err) {console.log (err);}) .on ( 'aborted', function () {console.log ( 'aborted');}) .on ( 'progress', function (bytesreceived, bytesexpected) {var n = parsefloat (bytesreceived/bytesexpected) .tofixed (2)*100);예, 콘솔이 예상대로 일련의 진행 값을 인쇄한다는 것을 알게되어 기쁩니다. 그런 다음 더 가십시오.
form .on ( 'progress', function (bytesreceived, bytesexpected) {var n = parseint (bytesReceived/bytesexpected) .tofixed (2)*100); res.write ( '<cript> window.parent.call ('+n+')) </upload, nehroy, n); call 방법은 페이지에 진행 값을 표시하는 것입니다. 불행히도, 당신은 마지막 100%만 볼 수 있으며, 특정 상세한 진행 값을 업로드 한 것을 볼 수 없습니다. 다시 탐색 ...
다음으로, 아이디어를 변경하고, 시도하고, 진행 값을 session 에 저장하고, 진행 상황을 조사하기위한 추가 요청을 추가합시다. 오, 나쁘지 않습니다! 요청하는 진행 값이 다른 업로드의 진행률 값보다는 이번에 업로드하는 진행 상황인지 확인하려면 업로드 된 요청 및 추가 요청에서 token 값에 동의해야합니다. 이제 또 다른 질문은 요청할 때이 token 얻는 방법입니다. 파일 업로드의 요청 본문이 Request Payload 에 있으므로 req.body 이 더미를 구문 분석하고 싶지 않습니다. 물론이 더미를 구문 분석하고 싶지 않습니다. url 에 넣는 것이 가장 좋습니다. 문제는 때로는 token 새로 고치려면 두 번 새로 고침해야한다는 것입니다. 최후의 수단으로서, 나는 그것을 cookie 에 넣을 것이다!
var 쿠키 = 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]); } return obj; } (); var querytoken = 쿠키 .__ token__; form .on ( 'progress', function (bytesreceived, bytesexpected) {var n = parseint (parsefloat (form.bytesReceived/form.bytesexpected) .tofixed (2)*100); if (req.session [ 'file'+querytoken]) {req .session [ '+querytoken'; req.session [ 'file'+querytoken] = {querytoken, console.log};IE789의 경우, 나는 진행 가치에 대한 여론 조사에 왔습니다. 나는 나를 용서하지만 내 마음은 아파요.
var getData = function () {$ .post ( '/uploader', {getfileInfo : 1, uploadtoken : utils.cookie.getCookie ( '__ token__')}) .then (function (data) {console.log (data.mes <0) {getData (); 전화 (pros.percent! = '100) {getData (); } getData (); call 방법은 페이지에 진행 값을 표시하는 것입니다. 불행히도, 당신은 마지막 100%만 볼 수 있으며, 특정 상세한 진행 값을 업로드 한 것을 볼 수 없습니다. 다시 탐색 ...
좋아, 나는 다시 그것에 빠졌다. 그러나 나는 여전히 무언가 잘못되었다고 생각합니다. Ajax 폴링에는 아무런 문제가 없습니다. 문제는 session 값을 갖기 전에 업로드가 완료 될 때까지 기다려야한다는 것입니다. 따라서 100%만 볼 수 있으며 상세한 진행 값을 볼 수 없습니다. 진행중인 이전 res.write 및이 req.session 중단되었다고 생각할 수 있지만 progress 해제 될 때까지 각 실행 결과를 저장하므로 100%만 볼 수 있습니다. 나는 formidable 소스 코드를 읽는 분위기가 아닙니다. 물론 이해할 수 없으므로 먼저 생각합니다!
ajax 폴링은 괜찮으므로 session 에 저장하는 것은 쉽지 않습니다. 실제로 작동하지 않으면 global 에서 시도하십시오. 그것은 글로벌 객체에 값을 넣을 수 없으며 그것을 매달릴 것입니다. 약간의 변화가 있으면 global 에 넣습니다.
form .on ( 'progress', 함수 (바이 테스 레지브, bytesexpected) {var n = parseint (parsefloat (form.bytesReceived/form.bytesexpected) .tofixed (2)*100); 글로벌 [파일 '+QueryToken] = {QueryToken, 백분율 : n}};여론 조사를 계속하십시오.
아름답습니다, 그게 다야! Chrome에서 내가 보는 것은 HTML5의 진행과 동일하지만 IE789에서 약간 갇혀있는 느낌이 들지만 여전히 상세한 진행 값을 볼 수 있습니다. 결국, 오래된 브라우저는 좋지 않습니다. 그리고 업로드 할 때마다 값을 global 에 넣으므로 적절하게 정리해야합니다. 파일이 업로드 된 후 지정된 디렉토리로 전송할 수 있습니다 global['file'+queryToken]=null ;
그러나 폴링은 많은 요청을 의미하며 여기에는 문제가있을 수 있습니다. 제한하지 않으면 진행 값은 500ms 간격마다 한 번씩 요청됩니다. 글쎄, IE789 진행 막대는 이와 같이 해결되었으며 플래시를 버리기로 합의합니다. 이 폴링은 모든 브라우저와 호환되지만 여전히 많은 요청이 낭비됩니다. IE789 이외의 HTML5를 계속 판단하자!
실제로, 당신이 그것을 측정하면, 어느 것이 더 합당하고, 플래시 업로드 또는 추가 요청이 더 있습니까? 플래시를 이해하지 못한 것에 대해 용서해 주시면 많이 말하지 않을 것입니다. 어쨌든, 나는 페이지에 추가 파일을 추가하고 싶지 않습니다.
요약
파일 업로드 구성 요소에 대한 많은 세부 사항이 여전히 있습니다. 나는 원래 JS 파일을 만들고 싶었지만 나중에 더 재사용하기 위해서는 독립 페이지로 수행하는 것이 더 좋을 것이라고 생각했습니다. 업로드 해야하는 경우 iframe만으로 JS 파일을 만드는 것보다 훨씬 낫습니다. 위는이 기사의 전체 내용입니다. 나는 그것이 당신의 공부 나 일에 당신을 도울 수 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다.