You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java RESTful服务与AngularJS打开服务器端PDF文件

完整实现:Java RESTful服务 + AngularJS 打开服务器PDF文件

我来帮你补全并完善这个Java RESTful服务+AngularJS打开PDF的完整方案,先从后端的完整实现说起:

Java RESTful 服务完整实现

你之前的代码片段有几个小问题(比如Content-Type拼写不全、没处理流关闭和异常),下面是修正后的完整实现,加入了更健壮的异常处理和资源管理:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

@Path("/pdf")
public class PdfService {

    @GET
    @Path("/getPDF")
    @Produces("application/pdf")
    public Response getPDF() {
        // 替换成服务器上PDF文件的实际绝对路径
        File pdfFile = new File("/opt/server-files/documents/sample.pdf");
        
        // 用try-with-resources自动关闭输入流,避免资源泄漏
        try (FileInputStream fileInputStream = new FileInputStream(pdfFile)) {
            Response.ResponseBuilder responseBuilder = Response.ok(fileInputStream);
            
            // 设置正确的PDF内容类型
            responseBuilder.type("application/pdf");
            // 设置Content-Disposition:用inline让浏览器直接打开,改成attachment则触发下载
            responseBuilder.header("Content-Disposition", "inline; filename=\"sample-document.pdf\"");
            // 告知浏览器文件大小,优化加载体验
            responseBuilder.header("Content-Length", pdfFile.length());
            
            return responseBuilder.build();
        } catch (IOException e) {
            if (e.getMessage().contains("No such file or directory")) {
                // 文件不存在时返回404错误
                return Response.status(Response.Status.NOT_FOUND)
                        .entity("请求的PDF文件在服务器上不存在")
                        .build();
            }
            // 其他IO异常返回500服务器错误
            return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
                    .entity("获取PDF文件时发生错误")
                    .build();
        }
    }
}

后端实现关键点

  • 用try-with-resources管理FileInputStream,不用手动关闭流,避免资源泄漏
  • 修正了Content-Type的拼写错误,确保返回正确的PDF类型
  • 添加Content-Disposition头,控制浏览器是直接打开(inline)还是下载(attachment)PDF
  • 完善异常处理,针对文件不存在和其他错误返回不同的HTTP状态码,方便前端排查问题
  • 确保应用程序有读取目标PDF文件的权限(比如Linux下给文件设置合适的用户组权限)

AngularJS 前端实现方案

根据你的需求,提供两种常用的前端实现方式:

方案1:直接跳转URL(最简单,适合无需认证的场景)

如果你的REST服务不需要用户认证,直接用普通链接或者AngularJS的$window跳转即可:

<!-- 在AngularJS模板中直接添加链接 -->
<a href="/api/pdf/getPDF" target="_blank">打开PDF文档</a>

或者在控制器里触发跳转:

angular.module('myApp').controller('PdfController', function($window) {
    this.openPdf = function() {
        // 在新窗口打开PDF
        $window.open('/api/pdf/getPDF', '_blank');
    };
});

模板里调用控制器方法:

<button ng-click="pdfCtrl.openPdf()">打开PDF</button>

方案2:带认证的$http请求(适合需要Token验证的场景)

如果你的REST服务需要携带认证令牌(比如JWT),可以用$http请求获取二进制Blob,再创建临时URL打开:

angular.module('myApp').controller('PdfController', function($http, $window) {
    this.openSecuredPdf = function() {
        $http({
            method: 'GET',
            url: '/api/pdf/getPDF',
            responseType: 'blob', // 必须设置为blob,否则会把二进制数据当成文本处理
            headers: {
                // 替换成你的认证令牌
                'Authorization': 'Bearer ' + localStorage.getItem('authToken')
            }
        }).then(function(response) {
            // 创建Blob临时URL
            var pdfBlob = new Blob([response.data], { type: 'application/pdf' });
            var pdfUrl = $window.URL.createObjectURL(pdfBlob);
            
            // 在新窗口打开PDF
            $window.open(pdfUrl, '_blank');
            
            // 1秒后释放临时URL,避免内存泄漏
            setTimeout(function() {
                $window.URL.revokeObjectURL(pdfUrl);
            }, 1000);
        }).catch(function(error) {
            console.error('加载PDF失败:', error);
            alert('无法打开PDF文件,请检查网络或联系管理员');
        });
    };
});

模板调用:

<button ng-click="pdfCtrl.openSecuredPdf()">打开加密PDF</button>

常见问题注意事项

  • 跨域问题:如果前端和后端不在同一域名下,需要在Java服务中配置CORS,添加Access-Control-Allow-Origin等响应头
  • 服务器路径:确保Java代码中的PDF路径是服务器可访问的绝对路径,并且应用进程有读取权限
  • 浏览器兼容性:现代浏览器都支持直接预览PDF,老旧浏览器可能会直接触发下载
  • 内存泄漏:用方案2时,一定要调用URL.revokeObjectURL()释放临时Blob资源

内容的提问来源于stack exchange,提问作者Theodosios Asvestopoulos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:09:17