我正在爲下載功能編寫處理程序。當用戶點擊他\她的瀏覽器中的下載按鈕時,會調用下載處理程序,然後開始下載(僅限mp3文件)。我有這個工作在PHP,但我已經改變了我的項目上的所有節點,我似乎無法得到最後一部分在Node上工作。如何從節點服務器下載文件(僅使用節點模塊,無需明文等)
這是PHP代碼我以前的工作:
<?php
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=".($_GET['title']));
readfile($_GET['path']);
?>
這是爲節點的新代碼:
function download(response, request){
var body = [];
request.on('data', function(chunk) {
body.push(chunk);
});
request.on('end', function() {
body = Buffer.concat(body).toString();
var data = qs.parse(body);
var title = data.songTitle;
var filePath = __dirname + "/../myproject/songs/"+title+".mp3";
fs.open(filePath,'r',function(err, fd){
if(!err){
fs.readFile(fd, function(err, data){
if(!err){
var rs = fs.createReadStream(filePath);
response.writeHead(200, {"Content-Type": "application/octet-stream",
"Content-Disposition": "attachment; filename="+title+".mp3",
"Content-Length" : data.length});
rs.pipe(response);
response.on("end",function(){
fs.close(fd);
});
}else{
console.log("Error while trying to read: ", err);
}
});
}else{
console.log("Error could not open: ", err);
}
});
});
當試圖下載,我沒有得到任何錯誤,但沒有發生。我也嘗試過用於內容類型的「audio/mpeg3」,沒有任何內容。關於發生什麼事的任何想法?請記住,我正在嘗試在不使用第三方模塊的情況下執行此操作。 請注意,函數download不作爲http.createServer()的回調函數傳遞。所以響應和請求的順序是不是問題:)
我不是100%,但它看起來像將文件傳遞給響應變量,而不是response.write()方法。你可以嘗試,response.write(rs);而不是行rs.pipe(response); – Cruiser
管道應該工作。 – robertklep