我正在使用服务器端的java + spring以及extdirectspring的应用程序。在客户端,它使用extjs / javascript。
我想在服务器端戳一个方法并从数据库中检索一个文件。如果文件不存在,那么我想以某种方式显示错误。
尝试检索文件并检查它是否需要在同一个调用中进行 - 文件可以在调用之间删除。
我可以看到人们在当前应用程序中完成它的方式是使用spring controllers + request mappings和window.open("someUrl/filename.blah");
,服务器从映射方法返回文件。
这似乎不允许你处理文件不存在的情况。
理想情况下,我只想从服务器发送一些json,它有文件数据(可能为null)和成功/失败。当我得到响应时,我可以显示有关失败的一些信息或打开文件。不幸的是,我无法观察当前的故障模式,因为某些地方正在缓存文件 - 如果我从数据库中删除它们,那么它们似乎仍然存在,你仍然可以下载它们!
通过'打开'我的意思是显示标准'你想用这个文件打开/保存'对话框。我不是要解析文件或用它做任何事情 - 我只是想把它提供给浏览器/用户。
有没有办法在不使用url和window.open的情况下执行此操作?例如,某些获取数据和文件名或类似名称的方法?
更新
data / json的传输不是我想要解决的问题。
由于我正在使用extdirect,我可能会这样做:
public class SomeClass
{
@ExtDirectMethod
public AFile getFile(Long id) throws Exception
{
//do stuff
}
}
然后在客户端,您只需:
someClass.getFile(id, function(file){
if(file.found){
SomeHowGiveThisToTheUser(file.name,file.data); ????
return;
}
ReportCouldntFind(file.name);
});
我不知道怎么做的是将文件提供给用户。
进一步更新
我认为没有blob网址或数据uri可以做到这一点。 this post中提到了这两个问题。我没有尝试过,因为我们不得不支持这两种技术都太旧的浏览器。
答案 0 :(得分:1)
你想要做一些标准的Ajax(假设你有jQuery可用)。
类似的东西:
$.getJSON( url, function( data ) {
if (data.success){
} else {
}
});
在服务器端,添加代码以返回预期的JSON。
在extJS中:
Ext.Ajax.request({
url : url,
method: 'GET',
headers: { 'Content-Type': 'application/json' },
params : params,
success: function (response) {
var jsonResp = Ext.util.JSON.decode(response.responseText);
if (response.success){
// do success stuff, like using response.fileData
} else {
// do fail stuff
}
failure: function (response) {
var jsonResp = Ext.util.JSON.decode(response.responseText);
// etc.
});
在Java servlet的服务器上你可以这样(假设apache commons file util):
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
InputStream in = new URL( "http://remote.file.url" ).openStream();
IOUtils.copy(in, response.getOutputStream());
}
可能是一种更具弹簧特色的方式,但这会给你一个想法。
对于您的情况,您希望将文件内容包装在包含success
proeprty的JSON对象中。为此,请使用Java JSON jar:http://json.org/java/
更新:最后了解您的要求。
我终于想到你正在问如何处理实际的下载。
这些天有几种方式。
看一下这个SO答案,这是使用iFrame:Download File Using Javascript/jQuery
还有一些花哨的下载程序组件,包括几个用于jQuery的程序。
所以你要做两个部分的过程:使用标准的ajax调用检查文件的可用性,然后如果response.success
,使用下载器将文件提供给用户。