2012-08-23 6 views
8

Request을 사용하여 파일을 업로드하고 있습니다.업로드 진행 - 요청

req = request.post url: "http://foo.com", body: fileAsBuffer, (err, res, body) -> 
    console.log "Uploaded!" 

실제로 얼마나 많은 데이터가 실제로 업로드되었는지 어떻게 알 수 있습니까? 구독 할 수있는 이벤트가 있습니까? 아니면 폴링 할 수있는 request의 속성이 있습니까?

없다면 업로드하는 데 가장 좋은 방법은 무엇이며 얼마나 업로드되었는지 알 수 있습니까?

답변

6

광산의 또 다른 프로젝트를위한 업로드 진행 상황에 대한 핸들이 필요했습니다.

내가 알아 낸 것은 requestconnection._bytesDispatched 속성을 폴링 할 수 있다는 것입니다. 예를 들어

:

r = request.post url: "http://foo.com", body: fileAsBuffer 
setInterval (-> console.log "Uploaded: #{r.req.connection._bytesDispatched}"), 250 

: 당신이 r에 배관 된 경우, 대신 r.req.connection.socket._bytesDispatched를 폴링.

+0

아주 좋아요, 고마워요! – darma

+2

이 역시 찾고 있습니다. 내부 API (미래의 nodejs 버전에서 변경 될 것으로 예상 됨)처럼 보이지만, 유일한 해결책 인 것 같습니다. –

+2

이것은 고통 스럽습니다. 이것이 유일한 Node.js 솔루션입니까? 정말로, Node.js의 HTTP API에 대한 파일 업로드 문제가 아직 해결되지 않은 이유는 무엇입니까? – Sukima

-1

누구든지 transloadit의 프로덕션 스택에서 실행중인 좋은 모듈을 생성했습니다 (신뢰할 수 있고 잘 유지 관리되고 있습니다). 당신은 여기에서 찾을 수 있습니다 : 당신은 다음 Socket.io

흥미있는 참고를 사용하여 클라이언트 상태를 밀어 수

var formidable = require('formidable'), 
    http = require('http'), 

    util = require('util'); 

http.createServer(function(req, res) { 
    if (req.url == '/upload' && req.method.toLowerCase() == 'post') { 
    // parse a file upload 
    var form = new formidable.IncomingForm(); 
    form.parse(req, function(err, fields, files) { 
     res.writeHead(200, {'content-type': 'text/plain'}); 
     res.write('received upload:\n\n'); 
     res.end(util.inspect({fields: fields, files: files})); 
    }); 
    return; 
    } 

    // show a file upload form 
    res.writeHead(200, {'content-type': 'text/html'}); 
    res.end(
    '<form action="/upload" enctype="multipart/form-data" method="post">'+ 
    '<input type="text" name="title"><br>'+ 
    '<input type="file" name="upload" multiple="multiple"><br>'+ 
    '<input type="submit" value="Upload">'+ 
    '</form>' 
); 
}).listen(80); 

: 같은

https://github.com/felixge/node-formidable

코드가 보일 것입니다 이것은 문제 중 하나 노드가 생성되었습니다. In this video Ryan은 사용자에게 실시간으로 파일을 업로드하는 가장 좋은 방법을 찾기 위해 노드가 시작된 방법에 대해 이야기합니다. 어쨌든 나는 빗 나갈 수 있지만 관심이 있다면 비디오는 가치가 있습니다. in 노드의 역사

+1

파일 받기 *입니다.나는 다른 서버에 노드 용 파일을 보내고있다. –

+4

Google 검색에 약 4 시간을 소비했습니다. 나만인가, 아니면 ** 노드에서 HTTP API로 파일을 보내는 세계의 사람들이 좋아할 것인가? Node.js는 서버 코드에만 유용하고 다른 것은 쓸모 없다는 공통된 생각이 들었다. 한숨. – Sukima

+0

그것은 단지 당신이 아니라 .. 나는 몇 시간 동안 이것에 대해 인터넷 검색을하고 있으며 어떤 합리적인 대답도 찾지 못했습니다. 당신은 아무것도 찾았습니까? – Besat

-1

이 방법을 시도해보십시오

var file = fs.createWriteStream("largefile.jpg"); 
var totalbytes = request.headers['content-length']; 
var donesofar = 0; 

request.pipe(file); 
request.on('data', function(chunk){ 
    donesofar += chunk.length; 
    var progress = (donesofar/totalbytes) * 100; 
    response.write(parseInt(progress, 10) + "%\n"); 

}); 
3

나는 requestnode 소스에 유효한 것을 찾기 위해 몇 시간을 보냈다, 그리고 마지막으로 나에게 더 정확한 느낌이 다른 접근 방법을 발견했다.

우리는 drain 이벤트와 bytesWritten 특성에 의존 할 수

let size = fs.lstatSync(path).size; 
let bytes = 0; 

request.put({ 
    url: 'https://example.org/api/upload', 
    body: fs.createReadStream(path).on('data', (chunk) => { 
    console.log(bytes += chunk.length, size); 
    }) 
}); 

스트림 버퍼 크기 : 당신이 파일 바이트의 진행 상황을 처리해야하는 경우 또는

request.put({ 
    url: 'https://example.org/api/upload', 
    body: fs.createReadStream(path) 
}).on('drain',() => { 
    console.log(req.req.connection.bytesWritten); 
}); 

, 그것은 스트림을 data 이벤트를 사용하는 것이 더 쉽습니다 는 65536 바이트이고 읽기/배수 절차는 반복적으로 실행됩니다.

이것은 나를 위해 node v4.5.0request v2.74.0로 꽤 잘 작동하는 것 같습니다.

+1

드레인 방법이 저에게 효과적이었습니다. 그러나 필자는 body 매개 변수를 통해 파일을 전달하는 것과 반대로 파일을 파이프해야했습니다. 본문 매개 변수를 통해 전달하면 여러 번 배출되지만 서버가 실제로 데이터를 수신하지 않은 경우에는 빠르게 연속해서 수행합니다. 그것은 시체를 통해 그것을 통과하면 올바른 경험을주지 않는, 버퍼링되는 것으로 나타납니다. 건배. – McP

0
var request = require('request'); 
    var fs = require('fs'); 
    let path ="C:/path/to/file"; 
    var formData = { 
     vyapardb: fs.createReadStream(path) 
    }; 

    let size = fs.lstatSync(path).size; 

    var headers = { 
     'Accept' : 'application/json', 
     'Authorization' : 'Bearer '+token, 
    }; 

    var r = request.post({url:'http://35.12.13/file/upload', formData: formData, headers: headers}, function optionalCallback(err, httpResponse, body) { 
     clearInterval(q); 

    }); 
    var q = setInterval(function() { 
     var dispatched = r.req.connection._bytesDispatched; 
     let percent = dispatched*100/size; 
     console.dir("Uploaded: " + percent + "%"); 

    }, 250); 
} 
관련 문제