2014-07-09 41 views
0

我在使用服務器端的java + spring和extdirectspring的應用程序中工作。在客戶端它使用extjs/javascript。在JavaScript中,你如何從服務器打開文件?

我想戳一個在服務器端的方法,並從數據庫中檢索一個文件。如果該文件不存在,那麼我想以某種方式顯示錯誤。

嘗試檢索文件並檢查它是否存在需要在同一個調用中發生 - 文件可以在調用之間刪除。

我可以看到人們在當前應用程序中完成的方式是使用spring controllers +請求映射和window.open("someUrl/filename.blah");,服務器從映射方法返回文件。

這似乎並沒有讓你處理文件不存在的情況。

理想情況下,我只想從服務器發送一些json文件數據(可能爲null)和成功/失敗。當我收到迴應時,我可以顯示關於失敗的一些信息或打開文件。不幸的是我無法觀察當前的失敗模式,因爲某處某處正在緩存文件 - 如果我從數據庫中刪除它們,它們似乎仍然存在,您仍然可以下載它們!

'打開'我的意思是顯示標準'你想用這個文件打開/保存'對話框。我沒有試圖解析文件或者做任何事情 - 我只是想爲瀏覽器/用戶提供服務。

有沒有辦法做到這一點,而不使用URL和window.open?例如一些採用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網址或數據的URI。這兩個都在this post中提到過。我還沒有嘗試過,因爲我們不得不支持兩種技術都太舊的瀏覽器。

+0

我相信你會找到解決方案,如果你想Google如何從服務器獲取數據而不加載頁面,但你需要做的是XHR請求。對這個術語進行搜索,你會發現綽綽有餘的信息。 –

+0

搜索的另一個術語是AJAX,它只是上述的替代名稱。我看到你在客戶端上使用ExtJS,並且我很確定他們有一個API來幫助完成這個任務。 –

+0

@cookiemonster我可能沒有說清楚 - 問題是沒有從服務器檢索數據,它讓瀏覽器保存/打開文件,如果它沒有直接從url中檢索 –

回答

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的百科全書文件使用率):

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罐子:http://json.org/java/


更新:終於明白你的要求。

我終於想到,你在問如何處理實際的下載。

這幾天有幾種方法。

看看這個SO答案,這是使用iframe:Download File Using Javascript/jQuery

也有幾個花哨的下載器組件,其中包括幾個jQuery的。

所以你會做兩部分的過程:使用標準的ajax調用來檢查文件的可用性,然後如果response.success使用下載器爲用戶提供文件。

+1

JavaScript沒有帶'getJSON'方法的'$'對象。 –

+1

@cookiemonster $是jQuery的快捷方式。 –

+0

@LibertPiouPiou:我知道它*可以*,但我沒有看到任何關於jQuery的問題,我敢打賭,OP不知道它是什麼。我確實看到OP正在使用ExtJS。 –

相關問題