2013-10-25 99 views
1

我遇到了nodejs問題。我現在正在製作一個服務器,將服務於用戶請求的文件。我所做的:Nodejs寫入文件

  • 我得到的路徑
  • 找到該文件(fs.exists()
  • 如果路徑是一個文件得到的流
  • stream.pipe(響應)

現在的問題是我希望用戶下載文件,但是如果我編寫.txt文件,管道方法會在瀏覽器中寫入文件的內容......因此,我嘗試使用.pdf,但在此如果網頁繼續加載並且什麼也沒有發生......可以有幫助嗎?

if(exists) { 

     response.writeHead(302, {"Content-type":'text/plain'}); 

     var stat = fs.statSync(pathname); 

     if(stat.isFile()) { 
      var stream = fs.createReadStream(pathname); 
      stream.pipe(response); 
     } else { 
      response.writeHead(404, {"Content-type":'text/plain'}); 
      response.end() 
     } 


     //response.end(); 

} else { 
     response.writeHead(404, {"Content-type":'text/plain'}); 
     response.write("Not Found"); 
     response.end() 
} 
+1

歡迎,你應該添加的代碼。那麼SO可以幫助你。謝謝 – jmingov

+1

看看['express'是'sendfile'](http://expressjs.com/api.html#res.sendfile)。它也爲您提供內容類型處理。 – cr0

回答

1

那麼,在你的if情況下,你總是Content-Type頭設置爲text/plain,這就是爲什麼你的瀏覽器中顯示文本文件內聯。而對於你的PDF,text/plain只是錯誤的,應該是application/pdf,所以你需要動態設置類型。

如果您希望瀏覽器強制下載,設置以下標題:

Content-Disposition: attachment; filename="your filename…" 
Content-Type: text/plain (or whatever your content-type is…) 

基本上,這是什麼Express's res.download功能確實還有內部,所以此功能可能是值得一試爲好。

+0

我會盡力的。例如,謝謝 – Greennnnn

+0

很好用,謝謝。但我不能使用setHeader和寫頭的權利? – Greennnnn

+0

我的意思是,你可以指定,當你做response.writeHeader()? – Greennnnn