Force to open “Save As…” popup open at text link click for PDF in HTML

后端 未结 18 1352
無奈伤痛
無奈伤痛 2020-11-22 10:28

I have some big size PDF catalogs at my website, and I need to link these as download. When I googled, I found such a thing noted below. It should open the \"Save As

18条回答
  •  一整个雨季
    2020-11-22 11:21

    I just had a very similar issue with the added problem that I needed to create download links to files inside a ZIP file.

    I first tried to create a temporary file, then provided a link to the temporary file, but I found that some browsers would just display the contents (a CSV Excel file) rather than offering to download. Eventually I found the solution by using a servlet. It works both on Tomcat and GlassFish, and I tried it on Internet Explorer 10 and Chrome.

    The servlet takes as input a full path name to the ZIP file, and the name of the file inside the zip that should be downloaded.

    Inside my JSP file I have a table displaying all the files inside the zip, with links that say: onclick='download?zip=<%=zip%>&csv=<%=csv%>'

    The servlet code is in 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;
                }
            }
        }
    }
    

    To compile on Tomcat you need the classpath to include tomcat\lib\servlet-api.jar or on GlassFish: glassfish\lib\j2ee.jar

    But either one will work on both. You also need to set your servlet in web.xml.

提交回复
热议问题