gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:16:42 24 4
gpt4 key购买 nike

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

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

尝试检索文件并检查文件是否存在需要在同一调用中进行 - 该文件可能会在调用之间被删除。

我看到人们在当前应用程序中完成此操作的方式是使用 spring Controller + 请求映射和 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 或 data uri 就不可能做到这一点。 this post 中提到了这两个内容。 。我还没有尝试过它们,因为我们必须支持对于这两种技术来说都太旧的浏览器。

最佳答案

您想要执行一些标准 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());
}

可能是一种更特定于 spring 的方法,但这给了你一个想法。

对于您的情况,您希望将文件内容包装在包含 success 属性的 JSON 对象中。为此,请使用 Java JSON jar:http://json.org/java/

<小时/>

更新:终于明白你在问什么了。

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

现在有几种方法。

看看这个答案,这是使用 iFrame:Download File Using Javascript/jQuery

还有几个精美的下载器组件,其中包括几个用于 jQuery 的组件。

因此,您将执行两部分过程:使用标准 ajax 调用检查文件可用性,然后如果response.success,则使用下载器将文件提供给用户。

关于javascript - 在javascript中如何从服务器打开文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24658590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com