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

In javascript how do you open a file from the server?

本文关键字:服务器 文件 javascript      更新时间:2023-09-26

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

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

检索文件的尝试和检查文件是否存在需要在同一个调用中进行——文件可以在调用之间被删除。

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

这似乎不能让你处理文件不存在的情况。

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

这里的"打开"是指显示标准的"你想对这个文件做什么?打开/保存"对话框。我不想解析文件或对它做任何事情——我只想把它提供给浏览器/用户。

有没有办法做到这一点,而不使用url和窗口打开?例如一些方法,需要一个blob的数据和一个文件名或类似的?

数据/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或data uri是不可能做到这一点的。这两个都在这篇文章中提到。我还没有尝试过,因为我们必须支持一个太老的浏览器,对于这两种技术。

您想要做一些标准的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文件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属性的JSON对象中。为此,使用Java JSON jar: http://json.org/java/


Update:终于明白你在问什么了

我终于想到你是在问如何处理实际的下载。

现在有很多方法。

看看这个答案,这是使用iFrame:下载文件使用Javascript/jQuery

还有一些奇特的下载组件,包括一些jQuery组件。

所以你会做一个两部分的过程:检查文件可用性使用标准ajax调用,然后如果response.success,使用下载器为用户提供文件。