java - 从 java servlet 下载时文件损坏

标签 java servlets

我在 servlet 中有一个进程,用于创建 .pdf 文件并将其发送到客户端。但是,Adobe 不会打开下载的文件(“打开此文档时出错。文件已损坏且无法修复。”)。驻留在服务器上的原始创建的文件很好,Adobe 打开它没有问题。

我的代码:

private static void sendFile(HttpServletResponse response, String pdfPath) throws FileNotFoundException, IOException {
    PrintWriter out = response.getWriter();
    File f = new File(pdfPath);

    response.setHeader("Content-Transfer-Encoding", "binary");
    response.setHeader("Content-Disposition", "attachment; filename=\"" + f.getName());
    response.setContentLength((int) f.length());

    response.setContentType("application/pdf");

    FileInputStream fileInputStream = new FileInputStream(pdfPath);

    int i;
    while ((i = fileInputStream.read()) != -1) {
        out.write(i);
    }
    fileInputStream.close();
    out.close();
}

最佳答案

Writer 写入字符,而不是字节。

使用响应输出流

并且不要逐字节读取和写入,尤其是从 FileInputStream 读取和写入。这是极其低效的。只需使用 Files.copy() .

关于java - 从 java servlet 下载时文件损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51410383/

相关文章:

java - 无法启动 firebase 模拟器 ui

Java - 处理来自实现 1 个接口(interface)的具体类的错误

java - 对字符串数组进行排序

java - HttpSessionListener.sessionCreated() 未被调用

eclipse - 通过 Tomcat 调试 Eclipse 时如何更改实例

Javaobject "Connection"不适用于禁用的 Cookie

java - 如何使用apache poi将动态Excel文件(列数可以超过)写入java对象

java - 找不到符号 - ArrayList;找不到符号 - 整数

java - applet 可以与 servlet 实例通信吗

java - 我的登录身份验证 Servlet 出错