如何使用ajax调用服务器在新的浏览器窗口中呈现文档。
到目前为止,我已经完成了以下工作。
第1步: 在按钮单击并传递文件名时对服务器进行ajax调用:
$(document).ready(
function(){
$('#clickme').click(function(){
$.ajax({
type:"GET",
url:"App/getfile",
data:{'filename':'D:\\sample.pdf'}
}).done(function(msg){
var wind = window.open("_blank");
wind.document.write(msg);
});
});
}
);
第2步:我在服务器端使用spring controller:
package my.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class ServeFiles {
@RequestMapping(value="getfile",method=RequestMethod.GET,produces="application/pdf")
public void serve(HttpServletRequest request,HttpServletResponse response) throws
Exception{
InputStream is = new FileInputStream(new File(request.getParameter("filename")));
response.setHeader("Content-Type", "application/pdf");
response.setHeader("Content-Disposition", "attachment;filename='mypdf.pdf'");
int read;
while((read=is.read())!=-1){
response.getOutputStream().write(read);
}
response.flushBuffer();
}
}
当pdf作为字节发送到浏览器时。从ajax代码中,你可以看到我正在将它写入一个新窗口,如下所示
%PDF-1.4 5 0 obj<< /长度119 /过滤器/ FlateDecode>> streamxڍ ڍ ???? em em em em em emem > x& U Ox pJ& 9 l + A v; [ ,Cendstream endobj 4 0 obj << / Type / Page / Contents 5 0 R / Resources 3 0 R / MediaBox [0 0 792 612] / Parent 6 0 R>> endobj 2 0 obj<< / Type / XObject / Subtype / Form / FormType 1 /PTEX.FileName(../Puzzlers.pdf)/PTEX.PageNumber 1 /PTEX.InfoDict 7 0 R / Matrix [0 -1 1 0 0 540] / BBox [0 0 540 720] / Resources&lt ;< / ProcSet [/ PDF / Text / ImageC] / Font<< / F1 8 0 R / F2 9 0 R / F3 10 0 R / TT2 11 0 R>> / XObject<< / Im1 12 0 R / Im2 13 0 R>> / ExtGState<< / GS1 14 0 R>> / ColorSpace<< / Cs6 15 0 R>>>> /长度374 /过滤/ FlateDecode>>流H l N @ > j& )]TDY AH EQEm“2- gBBV J Pk D , @@Hb F M @ Ȭ ѝ$ > pu T P)6 Tk g|2 Q,S $ B {{ 1}} $ E,TR ^。IL֞?n7MiKŸNdCBɜˌ]뿍 ɏ〜 S } L $ Ǫma =خF “v p M e a pyBuᇈFb S ] = S u ^Aۇٴۇٴjh Ǘ @ xendstream endobj 7 0 obj<< / CreationDate(D:20020328003700Z)/ ModDate(D:20020327163822-08'00')/制作人(Acrobat Distiller 5.0.5(Windows))/作者(Duarte)/创作者(ADOBEPS4.DRV版本4.50)/标题(会话2500_Bloch) ,J)>> endobj 8 0 obj<< /类型/字体/子类型/类型1 / FirstChar 32 / LastChar 148 /宽度[278 278 463 556 556 1000 685 278 296 296 407 600 278 407 278 371 556 556 556 556 556 556 556 556 556 556 278 278 600 600 600 556 800 685 704 741 741 648 593 759 741 295 556 722 593 907 741 778 667 778 722 649 611 741 630 944 667 667 648 333 371 333 600 500 259 574 611 574 611 574 333 611 593 258 278 574 258 906 593 611 611 611 389 537 352 593 520 814 537 519 519 333 223 333 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 463 463] /编码/ WinAnsiEncoding / BaseFont / CABMEJ#2BHelveticaNeue-Bold / FontDescriptor 16 0 R>> endobj 9 0 obj<< /类型/字体/子类型/类型1 / FirstChar 32 / LastChar 117 /宽度[278 278 444 556 556 1000 648 278 278 278 370 600 278 389 278 352 556 556 556 556 556 556 556 556 556 556 278 278 600 600 600 556 800 667 704 722 722 630 593 759 722 278 537 685 574 889 722 760 667 760 704 648 593 722 611 944 648 648 630 296 352 296 600 500 241 556 611 556 611 556 315 593 574 241 241 537 241 870 574 593 611 611 352 519 333 574] /编码/ WinAnsiEncoding / BaseFont / CABMIB#2BHelveticaNeue-Medium / FontDescriptor 17 0 R>> endobj 10 0 obj<< /类型/字体/子类型/类型1 / FirstChar 32 / LastChar 153 /宽度[278 259 426 556 556 1000 630 278 259 259 352 600 278 389 278 333 556 5
正如您所见,它向我展示了页面上到处都是Unicode字符。但我希望它显示为普通的pdf(或)任何其他文档(excel,doc,ppt)。
我该怎么做?
答案 0 :(得分:0)
Dirk Lachowski在评论中提到,你所采取的方法有点问题。 pdf是一个二进制文件(不是ascii),因此它需要一定的内容类型,以便浏览器根据需要解释它(我看到你在Java代码中使用了“生成application / pdf”)
您的控制器方法显示正常。因此,只需尝试通过执行以下操作在新窗口上打开链接:
<a href="App/getfile?filename=YOUR_FILE" target="_blank">Click to view</a>
祝你好运!
答案 1 :(得分:0)
感谢您帮助我。
我遵循了Shay的建议并按预期工作。
我在我的js中做了window.open("App/getfile?filepath="+String(file),"_blank");
并且工作得很好。 Hopefull请告诉我是否可以使用mime类型在浏览器中打开(.doc,.docx,.ppt,.pptx,.xls,.xlsx)等微软doc文件。
注意:浏览器是Internet Explorer 8.0
答案 2 :(得分:-1)
在新窗口/标签中尝试使用iframe / open文件。