Java AngularJS发布PDF数据总是失败

Java AngularJS发布PDF数据总是失败,java,angularjs,spring-web,Java,Angularjs,Spring Web,我正试图绕过Internet Explorer的URL限制(有关更多信息,请参阅),以生成PDF 我在客户端JS中有一个base-64编码字符串,表示PDF的字节流。对于Firefox和Chrome,我在字符串前面加上data:application/PDF;base64,和浏览器愉快地呈现数据URI 对于InternetExplorer,我试图在POST中将字符串发送回servlet,以便它可以返回内容类型为“application/pdf”的字节流。除了在客户端请求中传递实际的PDF内容外,

我正试图绕过Internet Explorer的URL限制(有关更多信息,请参阅),以生成PDF

我在客户端JS中有一个base-64编码字符串,表示PDF的字节流。对于Firefox和Chrome,我在字符串前面加上
data:application/PDF;base64,
和浏览器愉快地呈现数据URI

对于InternetExplorer,我试图在POST中将字符串发送回servlet,以便它可以返回内容类型为“application/pdf”的字节流。除了在客户端请求中传递实际的PDF内容外,我基本上遵循以下问题中提出的解决方案:

我的HTTP帖子如下所示:

我的服务器正在运行JavaSpringWebMVC服务。Convert控制器如下所示:

  • 响应标题显示以下内容:


所以我有两个问题:

  • 我是如何丢失
    base64pdf
    参数的?
    参数是否有最大长度?我尝试了这个问题中显示的原始数据,并按照下面用户陈振佳的建议,通过
    data:{base64pdf:pdf}
    传入参数

  • 如何让这个PDF调用在IE中工作?一方面,我想知道上面我做错了什么,但坦率地说,对于如何将客户端的这个base-64编码字符串转换为PDF,我愿意接受“正确答案”。(也就是说,如果这是一个问题,而我找错了方向,我也想知道。)


  • 我正在使用:

    • AngularJS 1.4.8
    • 弹簧4.2.3.释放
    • 爪哇8
    • 雄猫8

    尝试将方法上的
    @RequestMapping
    注释更改为:

    @RequestMapping(value = "/convert", produces = "application/pdf",method = RequestMethod.POST)
    

    或者,尝试以下AngularJS帖子:

    var req = { method: 'POST', url: 'example.com', headers: { 'Content-Type': 'application/pdf' }, data: { base64pdf: pdf } } 
    $http(req).then(function(){...}, function(){...});
    

    尝试将方法上的
    @RequestMapping
    注释更改为:

    @RequestMapping(value = "/convert", produces = "application/pdf",method = RequestMethod.POST)
    

    或者,尝试以下AngularJS帖子:

    var req = { method: 'POST', url: 'example.com', headers: { 'Content-Type': 'application/pdf' }, data: { base64pdf: pdf } } 
    $http(req).then(function(){...}, function(){...});
    

    我通过在请求正文中发送base64pdf字符串来完成这项工作

    在Java中,我创建了一个简单的模型:

    公共类付费持有者{
    专用字符串有效载荷;
    //接球手和接球手
    }
    
    然后我更新了控制器的方法签名:

    @RequestMapping(value=“/pdf”,method=RequestMethod.POST,products=“application/pdf”)
    公共责任生成(
    @RequestBody(required=true)有效载荷,
    HttpServletRequest(请求)
    
    最后更改了AngularJS请求:

    var pdf; // base-64 encoded string in this variable
    var request = {
        payload : pdf
    };
    var config = {
        headers: { 'Accept': 'application/pdf' },
        responseType : "arrayBuffer"
    };
    
    $http.post("/convert/pdf", request, config)
          .then( function onSuccess(result) { 
             var file = new Blob([result.data], {type: 'application/pdf'});
             window.navigator.msSaveOrOpenBlob(file, "result.pdf");
           },
           function onFailure() { /* log and do failure case stuff */ });
    

    我不知道为什么这篇文章不能使用params,特别是因为我在文档中找不到任何表明它不应该使用的东西。我将发布一个后续问题来解决这个问题。

    我通过在请求正文中发送base64pdf字符串来完成这项工作

    在Java中,我创建了一个简单的模型:

    公共类付费持有者{
    专用字符串有效载荷;
    //接球手和接球手
    }
    
    然后我更新了控制器的方法签名:

    @RequestMapping(value=“/pdf”,method=RequestMethod.POST,products=“application/pdf”)
    公共责任生成(
    @RequestBody(required=true)有效载荷,
    HttpServletRequest(请求)
    
    最后更改了AngularJS请求:

    var pdf; // base-64 encoded string in this variable
    var request = {
        payload : pdf
    };
    var config = {
        headers: { 'Accept': 'application/pdf' },
        responseType : "arrayBuffer"
    };
    
    $http.post("/convert/pdf", request, config)
          .then( function onSuccess(result) { 
             var file = new Blob([result.data], {type: 'application/pdf'});
             window.navigator.msSaveOrOpenBlob(file, "result.pdf");
           },
           function onFailure() { /* log and do failure case stuff */ });
    

    我不知道为什么这篇文章不能使用params,特别是因为我在文档中找不到任何表明它不应该使用的东西。我将发布一个后续问题来解决这个问题。

    对于$http.post,如果您没有在服务器端(spring mvc)指定请求的其他内容类型,请将内容类型设置为url表单编码,因为angular可能会与其他内容类型一起发送

    例如:

    $http({
    method: "post",
    url: URL,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    data: $.param({base64pdf: pdf})
    }).success(function (result){
             var file = new Blob([result.data], {type: 'application/pdf'});
             window.navigator.msSaveOrOpenBlob(file, "result.pdf");
    });
    

    对于$http.post,如果您没有在服务器端(spring mvc)指定请求的其他内容类型,则将内容类型设置为url表单编码,因为angular可能与其他内容类型一起发送

    例如:

    $http({
    method: "post",
    url: URL,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    data: $.param({base64pdf: pdf})
    }).success(function (result){
             var file = new Blob([result.data], {type: 'application/pdf'});
             window.navigator.msSaveOrOpenBlob(file, "result.pdf");
    });
    

    不,将
    products=“application/pdf”
    添加到方法注释中没有任何区别;请求仍然以同样的方式失败。即使在控制器和方法批注上都设置了
    products=
    ,行为仍然是相同的。var req={method:'POST',url:'',头:{'Content Type':'application/pdf'},数据:{base64pdf:pdf}}$$http(req)。然后(function(){…},function(){…});我已将你的第二条评论复制到你的答案正文中;您应该直接修改答案,而不是将答案添加为注释。:)我是第一次受到欢迎。我现在就试试你的第二个建议,看看效果如何。不,在方法注释中添加
    products=“application/pdf”
    没有什么区别;请求仍然以同样的方式失败。即使在控制器和方法批注上都设置了
    products=
    ,行为仍然是相同的。var req={method:'POST',url:'',头:{'Content Type':'application/pdf'},数据:{base64pdf:pdf}}$$http(req)。然后(function(){…},function(){…});我已将你的第二条评论复制到你的答案正文中;您应该直接修改答案,而不是将答案添加为注释。:)我是第一次受到欢迎。我现在将尝试你的第二个建议,看看效果如何。如果这对你有效,请接受这一正确答案,以便其他人可以先尝试这一点,而不是通过其他答案。这不是一个解决方案。这是一个解决办法。它也不能回答为什么我的第一次尝试不起作用,即使它应该起作用(据我所知)。@Bopsi如果这对你起作用,请接受这是正确的答案,以便其他人可以先尝试这一点,而不是通过其他答案。这不是一个解决方案。这是一个解决办法。它也不能回答为什么我的第一次尝试失败了
    $http({
    method: "post",
    url: URL,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    data: $.param({base64pdf: pdf})
    }).success(function (result){
             var file = new Blob([result.data], {type: 'application/pdf'});
             window.navigator.msSaveOrOpenBlob(file, "result.pdf");
    });