我正致力於獲取現有的Ajax樣式的Web應用程序,作爲Chrome打包應用程序運行。 Ajax應用程序在打包的應用程序內部的Webview中運行,並且大部分運行良好。Chrome打包的應用程序 - 從Webview下載文件
Ajax應用程序允許用戶使用標準HTML 5上傳和拖放操作來上傳文檔。上傳工作正常,但下載不起作用。
這是Ajax應用程序中邏輯的簡化示例。它使用Javascript來處理單擊事件,執行一些邏輯,然後通過設置隱藏的IFrame的位置最終觸發下載。
<html>
<head>
<script type="text/javascript">
function downloadFile(url) {
window.frames['dataTransfer'].location = url;
}
</script>
</head>
<body>
<a href="http://www.google.com" target="_blank">Google</a><br/>
<a href="https://s3.amazonaws.com/LYHKDevA1/2058e6cab4304af3a39eeb275eeac96d?response-content-disposition=attachment%3Bfilename%3D%22TestFile.pdf%22%3Bfilename*%3DUTF-8%27%27TestFile.pdf&Signature=FUlZZqNoJ%2F%2FvHIPX6CPDkvJ7uik%3D&Expires=1437854276&AWSAccessKeyId=1ZAN0NYFJ2DCQX8AN8G2" target="_blank">Download PDF</a><br/>
<a href="#" onclick="downloadFile('https://s3.amazonaws.com/LYHKDevA1/2058e6cab4304af3a39eeb275eeac96d?response-content-disposition=attachment%3Bfilename%3D%22TestFile.pdf%22%3Bfilename*%3DUTF-8%27%27TestFile.pdf&Signature=FUlZZqNoJ%2F%2FvHIPX6CPDkvJ7uik%3D&Expires=1437854276&AWSAccessKeyId=1ZAN0NYFJ2DCQX8AN8G2');return false;" target="_blank">Download PDF JS</a><br/>
<iframe name="dataTransfer" style="width: 0; height: 0; border: none;"></iframe><br/>
</body>
</html>
如果你在一個標準的Chrome標籤中運行這個,所有3個鏈接都可以正常工作。但是,在Chrome應用中,只有前兩個鏈接可以工作 - 單擊第三個鏈接不會執行任何操作。在開發人員工具的網絡部分,它實際上似乎開始下載,但很快就被取消了。
Chrome應用程序的清單允許Webview和涉及的相關域。
{
"manifest_version": 2,
"name": "Test Download",
"version": "0.1.0",
"permissions": [
"webview",
"<DOMAIN OF THE SAMPLE PAGE ABOVE>",
"https://s3.amazonaws.com/"
],
"app": {
"background": {
"scripts": ["background.js"]
}
},
"icons": {},
"minimum_chrome_version": "28"
}
Chrome應用程序也有一些簡單的newwindow
處理。
window.onload = function() {
var webview = document.querySelector('#app-webview');
webview.src = '<URL TO SAMPLE PAGE ABOVE>';
webview.addEventListener('newwindow', function(e) {
e.preventDefault();
e.stopPropagation();
window.open(e.targetUrl);
});
};
有關如何讓下載工作(希望不需要對Ajax應用程序進行重大更改)的任何建議?
根據https://chromiumcodereview.appspot.com/20803004/,這個API只是穩定,將在Chrome 30中可用。 –
是的,我今天發現它並沒有成爲29,但它正在成爲合併的目標。 –
非常感謝@chomp。你的例子的一個小小的修復 - 你需要使用'e.request.allow()'而不是'e.allow()'。 – tfasz