【问题标题】:In javascript how do you open a file from the server?在javascript中,如何从服务器打开文件?
【发布时间】:2014-07-15 00:06:13
【问题描述】:

我正在一个在服务器端使用 java + spring 以及 extdirectspring 的应用程序中工作。在客户端它使用 extjs/javascript。

我想在服务器端创建一个方法并从数据库中检索一个文件。如果文件不存在,那么我想以某种方式显示错误。

检索文件的尝试及其存在的检查需要在同一个调用中进行 - 可以在调用之间删除文件。

我可以看到人们在当前应用程序中使用的方式是使用 spring 控制器 + 请求映射和 window.open("someUrl/filename.blah");,服务器从映射方法返回文件。

这似乎无法让您处理文件不存在的情况。

理想情况下,我只想从具有文件数据(可能为空)和成功/失败的服务器发回一些 json。当我收到响应时,我可以显示有关失败的一些信息或打开文件。不幸的是,我无法观察到当前的故障模式,因为某处正在缓存文件 - 如果我从数据库中删除它们,那么它们似乎仍然存在,您仍然可以下载它们!

“打开”我的意思是显示标准的“你想用这个文件打开/保存做什么”对话框。我不想解析文件或对它做任何事情 - 我只是想将它提供给浏览器/用户。

有没有办法在不使用 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 url 或数据 uri 就不可能做到这一点。这两个都在this post 中提到。我还没有尝试过,因为我们必须支持对于这两种技术来说太旧的浏览器。

【问题讨论】:

  • 如果您使用 Google 了解如何在不加载页面的情况下从服务器获取数据,我相信您会找到解决方案,但您需要的是发出 XHR 请求。对该词进行搜索,您会找到足够多的信息。
  • 另一个要搜索的术语是 AJAX,它只是上面的替代名称。我看到你在客户端上使用 ExtJS,我很确定他们有一个 API 可以帮助解决这个问题。
  • @cookiemonster 我可能说得不够清楚 - 问题不是从服务器检索数据,而是让浏览器保存/打开文件,如果它没有直接从 url 检索
  • @cookiemonster 我现在更新了我的问题

标签: javascript extjs


【解决方案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,则使用下载器将文件提供给用户。

【讨论】:

  • JavaScript 没有带有 getJSON 方法的 $ 对象。
  • @cookiemonster $ 是 jQuery 的快捷方式。
  • @LibertPiouPiou:我知道它可以是,但我没有看到问题中提到 jQuery,我敢打赌 OP 不知道这是什么。我确实看到 OP 正在使用 ExtJS。
  • $.getJSON 不返回数据,因为它是异步的,它返回一个承诺
  • @cookiemonster - 答案已更新以包含 extJS 版本
猜你喜欢
  • 2012-01-24
  • 1970-01-01
  • 2020-11-01
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
相关资源
最近更新 更多