Java AngularJS发布PDF数据总是失败
我正试图绕过Internet Explorer的URL限制(有关更多信息,请参阅),以生成PDF 我在客户端JS中有一个base-64编码字符串,表示PDF的字节流。对于Firefox和Chrome,我在字符串前面加上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内容外,
data:application/PDF;base64,
和浏览器愉快地呈现数据URI
对于InternetExplorer,我试图在POST中将字符串发送回servlet,以便它可以返回内容类型为“application/pdf”的字节流。除了在客户端请求中传递实际的PDF内容外,我基本上遵循以下问题中提出的解决方案:
- 响应标题显示以下内容:
所以我有两个问题:
base64pdf
参数的?参数是否有最大长度?我尝试了这个问题中显示的原始数据,并按照下面用户陈振佳的建议,通过data:{base64pdf: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");
});