บังคับให้เปิดป๊อปอัพ“ บันทึกเป็น…” เปิดที่ลิงค์ข้อความคลิกสำหรับ PDF ใน HTML


173

ฉันมีแคตตาล็อก PDF ขนาดใหญ่ที่เว็บไซต์ของฉันและฉันต้องการลิงค์เหล่านี้เป็นการดาวน์โหลด เมื่อ googled ฉันพบสิ่งดังกล่าวด้านล่าง ควรเปิดป๊อปอัป" บันทึกเป็น ... " ที่ลิงก์คลิก ...

 <head>
    <meta name="content-disposition" content="inline; filename=filename.pdf">
    ...

แต่มันใช้งานไม่ได้: / เมื่อฉันลิงก์ไปยังไฟล์ดังต่อไปนี้มันเป็นเพียงลิงก์ไปยังไฟล์และพยายามเปิดไฟล์

    <a href="filename.pdf" title="Filie Name">File name</a>

อัปเดต (ตามคำตอบด้านล่าง):

อย่างที่ฉันเห็นไม่มีโซลูชันข้ามเบราว์เซอร์ที่เชื่อถือได้ 100% สำหรับสิ่งนี้ อาจเป็นวิธีที่ดีที่สุดในการใช้บริการเว็บอย่างใดอย่างหนึ่งที่ระบุไว้ด้านล่างและให้ลิงค์ดาวน์โหลด ...


1
ไม่ต้องแสดงชนิดไฟล์สำหรับไฟล์ pdf
bhups

ฉันลองวิธีแก้ปัญหาที่ปรับปรุงแล้วของคุณอาร์มาเนีย - แต่ปัญหาเดียวกันที่ฉันเกิดขึ้นกับ Safari เกิดขึ้น ฉันได้รับสิ่งที่ดูเหมือน PDF ในหน้าต่างเบราว์เซอร์และเมื่อฉันคลิกที่แท็บ "ดูตัวอย่าง" หรือ "ดาวน์โหลด" ที่ด้านล่างฉันจะได้รับคุณลักษณะการค้นหาที่ฉันต้องการอย่างยิ่ง
heathwaller


ที่คล้ายกัน แต่เฉพาะประเภทไฟล์ที่น้อยกว่า: stackoverflow.com/questions/1465573/…
Ciro Santilli 法轮功冠状病病六四事件法轮功

คำตอบ:


267

จากคำตอบให้บังคับเบราว์เซอร์ให้บันทึกไฟล์หลังจากคลิกลิงก์ :

<a href="path/to/file" download>Click here to download</a>

17
ในช่วงเวลาของความคิดเห็นนี้downloadแอตทริบิวต์นั้น จำกัด เฉพาะ Chrome, Firefox และ Opera แม้แต่ IE และ Safari เวอร์ชันล่าสุดยังไม่รองรับ สำหรับการสนับสนุนในอนาคต: ตรวจสอบcaniuse.com/#feat=download !
Sygmoral

การตรวจสอบข้อผิดพลาด Netbeans บ่นเกี่ยวกับมัน แต่ดูเหมือนว่าจะทำงานได้ดี คุณสามารถระบุชื่อเบื้องต้นสำหรับไฟล์ใหม่เช่น: download = "myFile.txt"
Yster

1
วิธีนี้ทำงานใน Edge ในขณะที่เขียนความคิดเห็นนี้และดูเหมือนเป็นวิธีเดียวที่เป็นไปได้ในการหยุดการเปิด PDF ที่เชื่อมโยงหลายมิติในความพยายามที่แย่มากของ Edge ในโปรแกรมดู PDF

ในช่วงเวลาของความคิดเห็นนี้ฉันได้ทดสอบกับ Chrome, Opera, Edge, Mozilla ล่าสุดทั้งหมด ทำงานบนทั้งหมดยกเว้นใน Mozilla
SI

7
นี้จะทำงานเฉพาะสำหรับการเชื่อมโยงเดียวกันกำเนิดเป็นที่กล่าวถึงในcaniuse.com/#feat=download หากลิงก์ของคุณเป็นจุดกำเนิดข้ามทางเลือกเดียวของคุณ (ตอนนี้) คือบังคับประเภทการตอบสนองให้กับ "application / octet-stream" ตามคำตอบที่แนะนำจำนวนมาก หากคุณไม่มีสิทธิ์เข้าถึงเซิร์ฟเวอร์คุณสามารถลองใช้พรอกซีและตั้งค่าส่วนหัวการตอบกลับด้วยตนเอง
jean-baptiste

80
<a href="file link" download target="_blank">Click here to download</a>

มันทำงานได้ดีสำหรับฉันใน Firefox และ Chrome


2
มันเหมือนกับคำตอบยอดนิยมปัจจุบันอย่างแน่นอนจาก Ayush Gupta ในปี 2013 target="_blank"อาจทำให้มันใช้งานได้มากขึ้นเล็กน้อยสำหรับเบราว์เซอร์ที่ไม่รองรับแม้ว่า (PDF จะเปิดในหน้าต่าง / แท็บใหม่แทนที่จะเขียนทับหน้าปัจจุบัน)
Sygmoral

3
สำหรับผมtarget="_blank"ก็จำเป็นที่downloadล้มเหลวเท่านั้นที่จะทำให้การดาวน์โหลดอย่างถูกต้อง (Chrome)
casraf

2
หากคุณให้สตริงในdownloadแอตทริบิวต์มันจะถูกใช้เป็นชื่อไฟล์ ฉันใช้มันใน userscripts ตลอดเวลา
อ่อนการตอบสนอง

34

เมตาแท็กไม่ใช่วิธีที่เชื่อถือได้เพื่อให้ได้ผลลัพธ์นี้ โดยทั่วไปคุณไม่ควรทำเช่นนี้ - ควรปล่อยให้ผู้ใช้ / ตัวแทนผู้ใช้ตัดสินใจว่าจะทำอย่างไรกับเนื้อหาที่คุณให้ ผู้ใช้สามารถบังคับให้เบราว์เซอร์ดาวน์โหลดไฟล์ได้หากต้องการ

หากคุณยังต้องการบังคับให้เบราว์เซอร์ดาวน์โหลดไฟล์ให้แก้ไขส่วนหัว HTTP โดยตรง นี่คือตัวอย่างรหัส PHP:

$path = "path/to/file.pdf";
$filename = "file.pdf";
header('Content-Transfer-Encoding: binary');  // For Gecko browsers mainly
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($path)) . ' GMT');
header('Accept-Ranges: bytes');  // Allow support for download resume
header('Content-Length: ' . filesize($path));  // File size
header('Content-Encoding: none');
header('Content-Type: application/pdf');  // Change the mime type if the file is not PDF
header('Content-Disposition: attachment; filename=' . $filename);  // Make the browser display the Save As dialog
readfile($path);  // This is necessary in order to get it to actually download the file, otherwise it will be 0Kb

โปรดทราบว่านี่เป็นเพียงส่วนขยายของโปรโตคอล HTTP เท่านั้น เบราว์เซอร์บางตัวอาจเพิกเฉยต่อไป


4
ในทางปฏิบัติฉันเชื่อว่ามีการใช้งานอย่างกว้างขวาง
Matthew Wilson

นี่คือทางออกที่ดีที่สุดไม่ยุ่งยากและทำงานได้ดี คุณสามารถดาวน์โหลดไฟล์ประเภทใดก็ได้โดยตรงโดยใช้วิธีนี้ +1
casraf

3
การถ่ายโอนเนื้อหาเข้ารหัสไม่มีอยู่ใน HTTP การเข้ารหัสเนื้อหา: ไม่มีประโยชน์อะไร
Julian Reschke

ทำบันทึกในคำตอบของคุณว่าไฟล์ IF นั้นมาจากเซิร์ฟเวอร์ / โดเมนภายนอกคำตอบนี้อาจไม่สามารถแก้ปัญหาได้ ...
T.Todua

ฉันต้องการเพิ่มว่าฉันมีรหัสนี้หรือรหัสที่คล้ายกันล้มเหลวในบางเซิร์ฟเวอร์เมื่อไฟล์มีขนาดใหญ่ (> 80 MB ในกรณีของฉัน) การใช้ob_end_flush()ก็ไม่ได้ช่วยอะไรเช่นกัน
Hendrik

22

ฉันมีปัญหาเดียวกันนี้และพบวิธีแก้ไขปัญหาที่ใช้งานได้ดีจนถึงตอนนี้ คุณใส่รหัสต่อไปนี้ใน.htaccessไฟล์ของคุณ:

<FilesMatch "\.(?i:pdf)$">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</FilesMatch>

มันมาจากกองทัพไฟล์เพื่อดาวน์โหลดแทนการแสดงในเบราว์เซอร์


4
สิ่งนี้ใช้ได้ดีเนื่องจากฉันมีไดเรกทอรีเอกสารเฉพาะสำหรับการดาวน์โหลด ฉันละเว้น ForceType เพียงเพื่อให้ประเภทอยู่ตามที่เป็น ฉันไม่ต้องการตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ด้วย ฉันดูเหมือนจะไม่สนใจตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แล้ว ฉันได้เพิ่มประเภทพิเศษสองสามอย่างรวมถึง optional-x สำหรับส่วนขยาย Office เก่า / ใหม่:<FilesMatch "\.(pdf|xlsx?|docx?)$">
goodeye

สิ่งนี้ทำงานได้อย่างยอดเยี่ยมแม้ใน OSX Safari ซึ่งเป็นคำตอบอื่น ๆ (รวมถึงคำตอบที่ได้รับการยอมรับในฐานะผู้วิจารณ์คนหนึ่งชี้ไปที่นั่น) จะถูก จำกัด เฉพาะเบราว์เซอร์บางตัวที่รองรับคุณสมบัติ HTML ที่กำหนด อันนี้ดูเหมือนจะเหมาะกับฉันมากกว่าเพราะมันใช้งานได้ทั่วทั้งกระดานแม้ว่ามันจะต้องใช้การเข้าถึงไฟล์กำหนดค่าเซิร์ฟเวอร์ระดับสูงกว่าก็ตาม
bwright

คุณสามารถใส่ลงในไฟล์ apache.conf ของคุณได้เช่นกันฉันไม่ได้ใช้. htaccess เพราะต้องใช้ทรัพยากรมากขึ้น
Michael Fever

เว็บไซต์ที่โฮสต์บน Windows จะใช้งานสิ่งนี้ได้อย่างไรเนื่องจากพวกเขาไม่สามารถอ่านไฟล์ htaccess ได้
PoloHoleSet

9

ฉันพบโซลูชันที่ง่ายมากสำหรับ Firefox (ใช้ได้เฉพาะกับญาติมากกว่าโดยตรง href): เพิ่มtype="application/octet-stream":

<a href="./file.pdf" id='example' type="application/octet-stream">Example</a>

1
@Martin Chrome บน Chrome OS และ Firefox บน Linux ปรากฎไฟล์ที่จะต้องเป็นท้องถิ่นเพื่อให้มันทำงาน href ของฉันคือ url ไปยังที่เก็บข้อมูลบนคลาวด์
ttfreeman

7

ลองเพิ่มบรรทัดนี้ลงในไฟล์. htaccess ของคุณ

AddType application/octet-stream .pdf

ฉันหวังว่ามันจะทำงานได้เหมือนเบราว์เซอร์ที่เป็นอิสระ


ฉันสนใจที่จะรู้ว่าทำไมสิ่งนี้จึงถูกลดทอนลง - เป็นหนึ่งในวิธีที่ง่ายที่สุดและใช้งานได้: css-tricks.com/snippets/htaccess/ ......
Nathan Hornby

ผู้คนพยายามปรับเปลี่ยนฟังก์ชั่นการทำงานหลักของเซิร์ฟเวอร์บนเว็บไซต์ที่ให้บริการพื้นที่ฟรีแล้วลงคะแนนเพราะไม่สามารถใช้งานได้ วิธีแก้ปัญหาอื่น ๆ ทั้งหมดจะมีคำเตือนเพราะมันคือ "แฮ็ค" เพื่อแทนที่สิ่งนี้
รถเข็นที่ถูกทิ้งร้าง

ฉันกำลังลงคะแนนเนื่องจากเป็นวิธีแก้ไขปัญหาที่ไม่ถูกต้อง เป็นความคิดที่ดีที่จะยุ่งกับทรัพยากรประเภทต่างๆ
แบรด

@NathanHornby - ฉันไม่ได้ลงคะแนนเลย แต่สิ่งนี้จะไม่ทำงานกับไซต์ที่โฮสต์บน Windows เนื่องจากไม่ใช้. htaccess
PoloHoleSet

ฉันไม่ได้ลงคะแนน แต่วิธีนี้ส่งผลกระทบต่อไฟล์ทั้งหมดของคำต่อท้าย มันเป็นการพิจารณาที่ไม่เหมาะสมและดังนั้นจึงไม่เหมาะสมในทุกกรณี
JBH

6

โดยทั่วไปจะเกิดขึ้นเนื่องจากการตั้งค่าเบราว์เซอร์หรือปลั๊กอินบางอย่างเปิด PDF โดยตรงในหน้าต่างเดียวกันเช่นหน้าเว็บแบบง่าย

ต่อไปนี้อาจช่วยคุณได้ ฉันทำมันใน PHP เมื่อไม่กี่ปีก่อน แต่ตอนนี้ฉันไม่ได้ทำงานบนแพลตฟอร์มนั้น

<?php
    if (isset($_GET['file'])) {
        $file = $_GET['file'];
        if (file_exists($file) && is_readable($file) && preg_match('/\.pdf$/',$file)) {
            header('Content-type: application/pdf');
            header("Content-Disposition: attachment; filename=\"$file\"");
            readfile($file);
        }
    }
    else {
        header("HTTP/1.0 404 Not Found");
        echo "<h1>Error 404: File Not Found: <br /><em>$file</em></h1>";
    }
?>

บันทึกดังกล่าวข้างต้นเป็นdownload.php

บันทึกตัวอย่างเล็ก ๆ นี้เป็นไฟล์ PHP ที่ใดที่หนึ่งบนเซิร์ฟเวอร์ของคุณและคุณสามารถใช้มันเพื่อดาวน์โหลดไฟล์ในเบราว์เซอร์แทนที่จะแสดงผลโดยตรง หากคุณต้องการให้บริการไฟล์อื่นที่ไม่ใช่ PDF ให้ลบหรือแก้ไขบรรทัดที่ 5

คุณสามารถใช้มันได้เช่น:

เพิ่มลิงค์ต่อไปนี้ไปยังไฟล์ HTML ของคุณ

<a href="download.php?file=my_pdf_file.pdf">Download the cool PDF.</a>

อ้างอิงจาก: บล็อกนี้


7
นี่เป็นวิธีที่ดีในการแสดงทุก ๆ ไฟล์บนเซิร์ฟเวอร์ของคุณให้กับทุกคนที่ให้ความสนใจ download.php?file=database_password_file.phpตัวอย่างเช่น.
pbarney

5

เพียงแค่ใส่รหัสด้านล่างใน.htaccessไฟล์ของคุณ:

AddType application/octet-stream .csv
AddType application/octet-stream .xls
AddType application/octet-stream .doc
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .mov
AddType application/octet-stream .pdf

หรือคุณสามารถหลอกลวงด้วย JavaScript

element.setAttribute( 'download', whatever_string_you_want);

1
สิ่งนี้ไม่ถือว่าเว็บเซิร์ฟเวอร์เป็นApacheใช่หรือไม่
Peter Mortensen

5

ฉันเพิ่งใช้มัน แต่ฉันไม่รู้ว่าใช้ได้กับเบราว์เซอร์ทั้งหมดหรือไม่

มันทำงานได้ใน Firefox:

<a href="myfile.pdf" download>Click to Download</a>

1
นั่นเป็นข้อเสนอแนะและมีข้อมูลพื้นฐานมากขึ้นในคำตอบก่อนหน้านี้
usr2564301

4

จริงๆวิธีง่ายๆในการบรรลุเป้าหมายนี้ได้โดยไม่ต้องใช้เว็บไซต์ดาวน์โหลดภายนอกหรือการปรับเปลี่ยนส่วนหัวอื่น ๆ ก็คือการสร้างไฟล์ ZIP พร้อมด้วยภายใน PDF และการเชื่อมโยงโดยตรงกับไฟล์ ZIP สิ่งนี้จะทริกเกอร์ไดอะล็อกบันทึก / เปิดและยังคงเป็นเรื่องง่ายสำหรับผู้ที่จะดับเบิลคลิกหน้าต่าง PDF ที่โปรแกรมที่เกี่ยวข้องกับ. zip เปิดตัว

BTW เป็นคำถามที่ดีฉันกำลังมองหาคำตอบเช่นกันเนื่องจากปลั๊กอิน PDF ที่ฝังในเบราว์เซอร์ส่วนใหญ่ใช้เวลานานมากในการแสดงอะไร (และมักจะแขวนเบราว์เซอร์ในขณะที่ PDF กำลังโหลด)


31
การใช้งานแย่มาก ผู้ใช้หลายคนไม่รู้ว่าจะทำอย่างไรกับไฟล์ zip
CodeWarrior

1
บางครั้งวิธีแก้ปัญหาง่าย ๆ ก็คือทางออกที่ดีที่สุด!
elrado

1
ไม่ใช่ทางออกที่ดี ฉันมีปัญหาตรงนี้กับ Firefox และไฟล์ ZIP ฉันควรทำอย่างไรดี? บีบอัดไฟล์หรือไม่ ในกรณีดังกล่าวการแก้ไขส่วนหัว HTTP อาจเป็นวิธีแก้ปัญหา แต่ฉันไม่สามารถเข้าถึงได้
Arnaud Weil

2

โซลูชันฝั่งเซิร์ฟเวอร์เข้ากันได้มากขึ้นจนกว่าจะมีการใช้งานแอตทริบิวต์ "ดาวน์โหลด" ในเบราว์เซอร์ทั้งหมด

ตัวอย่างหนึ่งของ Python อาจเป็นตัวจัดการการร้องขอ HTTP แบบกำหนดเองสำหรับที่เก็บไฟล์ ลิงก์ที่ชี้ไปยังที่เก็บไฟล์ถูกสร้างขึ้นเช่นนี้:

http://www.myfilestore.com/filestore/13/130787e71/download_as/desiredName.pdf

นี่คือรหัส:

class HTTPFilestoreHandler(SimpleHTTPRequestHandler):

    def __init__(self, fs_path, *args):
        self.fs_path = fs_path                          # Filestore path
        SimpleHTTPRequestHandler.__init__(self, *args)

    def send_head(self):
        # Overwrite SimpleHTTPRequestHandler.send_head to force download name
        path = self.path
        get_index = (path == '/')
        self.log_message("path: %s" % path)
        if '/download_as/' in path:
            p_parts = path.split('/download_as/')
            assert len(p_parts) == 2, 'Bad download link:' + path
            path, download_as = p_parts
        path = self.translate_path(path )
        f = None
        if os.path.isdir(path):
            if not self.path.endswith('/'):
                # Redirect browser - doing basically what Apache does
                self.send_response(301)
                self.send_header("Location", self.path + "/")
                self.end_headers()
                return None
            else:
                return self.list_directory(path)
        ctype = self.guess_type(path)
        try:
            f = open(path, 'rb')
        except IOError:
            self.send_error(404, "File not found")
            return None
        self.send_response(200)
        self.send_header("Content-type", ctype)
        fs = os.fstat(f.fileno())
        self.send_header("Expires", '0')
        self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
        self.send_header("Cache-Control", 'must-revalidate, post-check=0, pre-check=0')
        self.send_header("Content-Transfer-Encoding", 'binary')
        if download_as:
            self.send_header("Content-Disposition", 'attachment; filename="%s"' % download_as)
        self.send_header("Content-Length", str(fs[6]))
        self.send_header("Connection", 'close')
        self.end_headers()
        return f


class HTTPFilestoreServer:

    def __init__(self, fs_path, server_address):
        def handler(*args):
            newHandler = HTTPFilestoreHandler(fs_path, *args)
            newHandler.protocol_version = "HTTP/1.0"
        self.server = BaseHTTPServer.HTTPServer(server_address, handler)

    def serve_forever(self, *args):
        self.server.serve_forever(*args)


def start_server(fs_path, ip_address, port):
    server_address = (ip_address, port)
    httpd = HTTPFilestoreServer(fs_path, server_address)

    sa = httpd.server.socket.getsockname()
    print "Serving HTTP on", sa[0], "port", sa[1], "..."
    httpd.serve_forever()

2

วิธีง่าย ๆ ในการทำเช่นนี้หากคุณต้องการบังคับให้ดาวน์โหลดลิงค์เดียวในหน้าของคุณคือใช้ HTML5 download-attribute ใน href-link

ดู: http://davidwalsh.name/download-attribute

ด้วยวิธีนี้คุณสามารถเปลี่ยนชื่อไฟล์ที่ผู้ใช้จะดาวน์โหลดและในขณะเดียวกันก็บังคับให้ดาวน์โหลด

มีการถกเถียงกันว่านี่เป็นการปฏิบัติที่ดีหรือไม่ แต่ในกรณีของฉันฉันมีตัวแสดงที่ฝังตัวสำหรับไฟล์ PDF และตัวแสดงนั้นไม่มีลิงค์ดาวน์โหลดดังนั้นฉันต้องแยกจากกัน ที่นี่ฉันต้องการให้แน่ใจว่าผู้ใช้ไม่ได้เปิด PDF ในเว็บเบราว์เซอร์ซึ่งอาจสร้างความสับสน

สิ่งนี้จะไม่จำเป็นต้องเปิดการบันทึกตามกล่องโต้ตอบ แต่จะดาวน์โหลดลิงค์ตรงไปยังปลายทางการดาวน์โหลดที่ตั้งไว้ล่วงหน้า และแน่นอนว่าถ้าคุณกำลังทำเว็บไซต์ให้คนอื่นและต้องการให้พวกเขาเขียนคุณลักษณะด้วยตัวเองไปยังลิงก์ของพวกเขาอาจเป็นความคิดที่ไม่ดี แต่ถ้ามีวิธีที่จะทำให้แอตทริบิวต์นั้นเข้าสู่ลิงก์


1

นี่คือโพสต์เก่า แต่นี่คือโซลูชันของฉันใน JavaScript สิ่งที่ใช้ไลบรารี jQuery

<script>
(function($){
    var download = [];
    $('a.force-download, .force-download a').each(function(){
        // Collect info
        var $this = $(this),
            $href = $this.attr('href'),
            $split = $href.split('/'),
            $name = document.title.replace(/[\W_]/gi, '-').replace(/-{2,}/g, '-'); // get title and clean it for the URL

        // Get filename from URL
        if($split[($split.length-1)])
        {
            $tmp = $split[($split.length-1)];
            $tmp = $tmp.split('.');
            $name = $tmp[0].replace(/[\W_]/gi, '-').replace(/-{2,}/g, '-');
        }

        // If name already exists, put timestamp there
        if($.inArray($name, download) > -1)
        {
            $name = $name + '-' + Date.now().replace(/[\W]/gi, '-');
        }

        $(this).attr("download", $name);
        download.push($name);
    });
}(jQuery || window.jQuery))
</script>

คุณเพียงแค่ต้องใช้คลาสforce-downloadภายใน<a>แท็กของคุณและจะบังคับให้ดาวน์โหลดอัตโนมัติ คุณยังสามารถเพิ่มลงในพาเรนต์divและจะรับลิงก์ทั้งหมดที่อยู่ภายใน

ตัวอย่าง:

<a href="/some/good/url/Post-Injection_Post-Surgery_Instructions.pdf" class="force-download" target="_blank">Download PDF</a>

นี่ยอดเยี่ยมสำหรับ WordPress และระบบอื่น ๆ หรือเว็บไซต์ที่กำหนดเอง


0

หลังจากชื่อไฟล์ในรหัส HTML ฉันเพิ่ม ?forcedownload=1

นี่เป็นวิธีที่ง่ายที่สุดที่ฉันจะเปิดกล่องโต้ตอบเพื่อบันทึกหรือดาวน์โหลด


0

หากคุณมีปลั๊กอินภายในเบราว์เซอร์ที่รู้วิธีเปิดไฟล์ PDF มันจะเปิดโดยตรง ไลค์ในกรณีของรูปภาพและเนื้อหา HTML

ดังนั้นวิธีการอื่นคือไม่ส่งประเภท MIME ของคุณในการตอบกลับ ด้วยวิธีนี้เบราว์เซอร์จะไม่มีทางรู้ว่าปลั๊กอินใดควรเปิด ดังนั้นมันจะให้กล่องโต้ตอบบันทึก / เปิด


เป็นเรื่องยากที่จะทำได้เพราะเป็นเซิร์ฟเวอร์ที่ส่งประเภท mime และเมื่อเชื่อมโยงไปยังไฟล์ PDF โดยตรงคุณจะไม่สามารถเปลี่ยนส่วนหัวได้
Karel Petranek

0

ฉันเพิ่งมีปัญหาที่คล้ายกันมากกับปัญหาเพิ่มที่ฉันต้องการในการสร้างลิงค์ดาวน์โหลดไปยังไฟล์ภายในไฟล์ ZIP

ฉันพยายามสร้างไฟล์ชั่วคราวก่อนจากนั้นให้ลิงก์ไปยังไฟล์ชั่วคราว แต่ฉันพบว่าเบราว์เซอร์บางตัวเพิ่งจะแสดงเนื้อหา (ไฟล์ CSV Excel) แทนที่จะเสนอให้ดาวน์โหลด ในที่สุดฉันก็พบวิธีแก้ปัญหาโดยใช้ servlet มันใช้งานได้ทั้งบน Tomcat และ GlassFish และฉันก็ลองใช้บน Internet Explorer 10 และ Chrome

เซิร์ฟเล็ตใช้ชื่อพา ธ แบบเต็มไปยังไฟล์ ZIP และชื่อของไฟล์ภายในไฟล์ zip ที่ควรดาวน์โหลด

ข้างในไฟล์ JSP ของฉันฉันมีตารางแสดงไฟล์ทั้งหมดที่อยู่ใน zip โดยมีลิงก์ที่บอกว่า: onclick='download?zip=<%=zip%>&csv=<%=csv%>'

รหัส servlet อยู่ใน download.java:

package myServlet;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.zip.*;
import java.util.*;

// Extend HttpServlet class
public class download extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        PrintWriter out = response.getWriter(); // now we can write to the client

        String filename = request.getParameter("csv");
        String zipfile = request.getParameter("zip");

        String aLine = "";

        response.setContentType("application/x-download");
        response.setHeader( "Content-Disposition", "attachment; filename=" + filename); // Force 'save-as'
        ZipFile zip = new ZipFile(zipfile);
        for (Enumeration e = zip.entries(); e.hasMoreElements();) {
            ZipEntry entry = (ZipEntry) e.nextElement();
            if(entry.toString().equals(filename)) {
                InputStream is = zip.getInputStream(entry);
                BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"), 65536);
                while ((aLine = br.readLine()) != null) {
                    out.println(aLine);
                }
                is.close();
                break;
            }
        }
    }
}

ในการรวบรวม Tomcat คุณต้องการ classpath เพื่อรวม tomcat \ lib \ servlet-api.jar หรือบน GlassFish: glassfish \ lib \ j2ee.jar

แต่จะทำงานทั้งสองอย่างใดอย่างหนึ่ง คุณต้องตั้ง servlet ของคุณweb.xmlด้วย


0

เพิ่มหัวข้อการตอบสนองเนื้อหา - การจัดการ: สิ่งที่แนบมา; ตามด้วยชื่อไฟล์ ลบ Meta-Disposition; Inline; ซึ่งจะเปิดเอกสารในหน้าต่างเดียวกัน

ในจาวามันถูกตั้งค่าเป็น

response.setHeader("Content-Disposition", "attachment;filename=test.jpg");

-2

ด้วยไฟล์ PDF ขนาดใหญ่เบราว์เซอร์จะหยุดทำงาน ใน Mozilla เมนูเครื่องมือตัวเลือกแอปพลิเคชันจากนั้นติดกับเอกสารประเภท Adobe Acrobat ในรายการแบบเลื่อนลงการกระทำเลือกถามทุกครั้ง

สิ่งนี้ไม่ได้ผลสำหรับฉันดังนั้นสิ่งที่ได้ผลคือ:

เครื่องมือเมนู * → โปรแกรมเสริมAdobe Acrobat (ปลั๊กอิน Adobe PDF สำหรับ Firefox) →ปิดใช้งาน ตอนนี้ฉันสามารถดาวน์โหลดหนังสืออิเล็กทรอนิกส์ได้แล้ว!


2
คุณอ่านคำถามหรือไม่ นี่ไม่ใช่คำตอบข้ามเบราว์เซอร์
Mark

1
@mark ยังเป็นคำแนะนำสำหรับผู้ใช้ในการพรอมต์การดาวน์โหลดไฟล์ PDF แบบบังคับไม่ใช่เจ้าของเว็บไซต์
Nathan Hornby
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.