web-gelistirme-sc.com

Express js kullanarak tarayıcıda Pdf görüntüleme

app.post('/asset', function(request, response){
  var tempFile="/home/applmgr/Desktop/123456.pdf";
  fs.readFile(tempFile, function (err,data){
     response.contentType("application/pdf");
     response.send(data);
  });
});

Ben ifade ifadesi için yeni bir bitayım, veri nesnesiyle yanıtı gönderemiyorum ..

26
Dexter

Kodunuzu test ettim ve benim için bir değişiklikle kromda çalışıyor: app.post - app.get

EDIT: Yalnızca POST sunucusunun iyi bir fikir olduğunu düşündüğünüz için şunu okuyun: http://net.tutsplus.com/tutorials/other/a-beginners-introduction-to-http-and-rest/ HTTP fiillerine kadar aşağı kaydırın ve GET ve POST arasındaki farkı kontrol edin. :)

Bazı hızlı araştırmalar, diğer tarayıcıların başka sorunları olabileceğini, örneğin IE URL’nin .pdf ile bitmesini beklediğini öne sürüyor. Mac'imde olduğum için bunu senin için test edemiyorum;)

7
rdrey

Bir dosyanın indirilmesinin nasıl işlendiğini belirlemek, Content-disposition başlığına gelir. Ayrıca burada dosyanın adını da belirtebilirsiniz. Ayrıca tarayıcının kendisine verilen dosyayla ne yapacağını bilmesini sağlamak için Content-type 'u da ayarladık.

Express.js Örneği:

app.post('/url/to/hit', function(req, res, next) {
  var stream = fs.readStream('/location/of/pdf');
  var filename = "WhateverFilenameYouWant.pdf"; 
  // Be careful of special characters

  filename = encodeURIComponent(filename);
  // Ideally this should strip them

  res.setHeader('Content-disposition', 'inline; filename="' + filename + '"');
  res.setHeader('Content-type', 'application/pdf');

  stream.pipe(res);
});

Şimdi Content-disposition dosyasına daha yakından bakarsanız, tarayıcının dosyaya nasıl tepki vereceğini ayarlayan inline; alanının farkına varacaksınız. İndirmeleri zorlamak istiyorsanız, bunu inline; öğesini attachment; olarak ayarlayarak yapabilirsiniz.

Ayrıca (birkaç kez yakılarak) dosya adınıza özel karakterler koyarsanız kırılabileceğini öğrendim. Bu yüzden, bunun olmamasını sağlamak için dosya ismini encodeURIComponent().

Başkalarının da aynı şeyi anlamaya çalışmasına yardımcı olan umut!

Düzenle

Bunu başlangıçta ve şimdi gönderdiğim zaman arasında, content-disposition 'un dosyaadı parametresini nasıl doğru kodlayacağımı öğrendim. Özelliğe göre, dosya adı RFC5987 kodlanmış olmalıdır. Burada kodlamayı doğru şekilde işleyen bir örnek kod parçacığını / MDN'den buldum (encodeURIComponent() bu alan için tam olarak doğru değil).

MDN Metin Parçacığı

var fileName = 'my file(2).txt';
var header = "Content-Disposition: attachment; filename*=UTF-8''" 
             + encodeRFC5987ValueChars(fileName);

console.log(header); 
// logs "Content-Disposition: attachment; filename*=UTF-8''my%20file%282%29.txt"

function encodeRFC5987ValueChars (str) {
    return encodeURIComponent(str).
        // Note that although RFC3986 reserves "!", RFC5987 does not,
        // so we do not need to escape it
        replace(/['()]/g, escape). // i.e., %27 %28 %29
        replace(/\*/g, '%2A').
            // The following are not required for percent-encoding per RFC5987, 
            // so we can allow for a little better readability over the wire: |`^
            replace(/%(?:7C|60|5E)/g, unescape);
}

Bunun üzerine başka bir not, tarayıcılar da spesifikasyonlara tam olarak uymuyor. Bazı karakterler indirmeden yine yanlış gelecektir (en azından test ettiğimde). 

İndirmelerinizin nasıl çalıştığını güncelleyerek this sorununu çözebilirsiniz. İndirme URL’niz dosya adıyla bitiyorsa (ve başlıkta filename niteliğini sağlamıyorsanız), dosya adını URL kodlu değerinden doğru bir şekilde alır. IE 'http://subdomain.domain-url.com/some/path/to/downloads/' + encodeURIComponent("You're there, download this!.pdf")

Jeeze ve indirmelerinize dosya adı vermek için hepsi!

24
AlbertEngelB

Doğrudan [Tarayıcıya bir PDF gönderme çözümü:

app.get('/my/pdf', function (req, res) {
    var doc = new Pdf();
    doc.text("Hello World", 50, 50);

    doc.output( function(pdf) {
        res.type('application/pdf');
        res.end(pdf, 'binary');
    });
});

res.end () ikinci param ile 'ikili' benim durumumda hile yaptı. Aksi takdirde, ifade bir dize olarak yorumlanır.

10
sja

Aşağıdaki kod kadar basittir:

var express = require('express'),
    fs = require('fs'),
    app = express();

app.get('/', function (req, res) {
    var filePath = "/files/my_pdf_file.pdf";

    fs.readFile(__dirname + filePath , function (err,data){
        res.contentType("application/pdf");
        res.send(data);
    });
});

app.listen(3000, function(){
    console.log('Listening on 3000');
});

Tüm repo için:

Clone node-cheat pdf_browser , node app komutunu ve ardından npm install express komutunu çalıştırın.

Mutlu Yardımlar!

4

Aslında express, uzaktan kumandaya dosya gönderme özelliğine sahiptir. Tum ihtiyacin olan sey :

app.get('/sendMePDF', function(req, res) {
  res.sendFile(__dirname + "/static/pdf/Rabbi.pdf");
})

Burada sunucu "Rabbi.pdf" dosyasını gönderecek ve tarayıcıda pdf açtığınız gibi tarayıcıda açılacaktır. Dosyayı "statik" klasörüne yerleştirdim ama sendFile () işlevinin mutlak yolu (göreceli değil) argüman olarak aldığını bilerek herhangi bir yere yerleştirebilirsiniz.

0
Peco