在javascript中如何从服务器打开文件?

时间:2014-07-09 16:03:21

标签: javascript extjs

我正在使用服务器端的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中提到了这两个问题。我没有尝试过,因为我们不得不支持这两种技术都太旧的浏览器。

1 个答案:

答案 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,使用下载器将文件提供给用户。