我被要求创建一个“下载”按钮,将同一页上的文本区域内容作为文件下载,并显示浏览器的“另存为...”对话框。复制/粘贴可以完成这项工作,但这是一个“要求”。
目前,我只是将文本区域的内容发布到服务器,并使用Content-disposition: attachment
返回它们。是否有办法仅使用客户端Javascript实现这一点?
我被要求创建一个“下载”按钮,将同一页上的文本区域内容作为文件下载,并显示浏览器的“另存为...”对话框。复制/粘贴可以完成这项工作,但这是一个“要求”。
目前,我只是将文本区域的内容发布到服务器,并使用Content-disposition: attachment
返回它们。是否有办法仅使用客户端Javascript实现这一点?
它使用浏览器的下载对话框,但仅支持FF和Chrome,也许现在还有更多的浏览器?
function saveTextAsFile(textToWrite, fileNameToSaveAs)
{
var textFileAsBlob = new Blob([textToWrite], {type:'text/plain'});
var downloadLink = document.createElement("a");
downloadLink.download = fileNameToSaveAs;
downloadLink.innerHTML = "Download File";
if (window.webkitURL != null)
{
// Chrome allows the link to be clicked
// without actually adding it to the DOM.
downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
}
else
{
// Firefox requires the link to be added to the DOM
// before it can be clicked.
downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
downloadLink.onclick = destroyClickedElement;
downloadLink.style.display = "none";
document.body.appendChild(downloadLink);
}
downloadLink.click();
}
<textarea id=t>Hey</textarea><br>
<button onclick=saveTextAsFile(t.value,'download.txt')>Download</button>
我在这里找到了一个简单的解决方案:https://codepen.io
My text area:<br />
<textarea rows='10' cols='80' id='myTextArea' ></textarea>
<br /><br />
Download button: <br />
<input value='download' type='button'
onclick='doDL(document.getElementById("myTextArea").value)' />
<script type='text/javascript'>
function doDL(s){
function dataUrl(data) {return "data:x-application/text," + escape(data);}
window.open(dataUrl(s));
}
</script>
希望这有所帮助。
window.location = "data:application/octet-stream,"+text
,但这种方法无法提供一个机制,让你建议一个文件名。而且IE对数据URI的最大长度有很小的限制,这可能会成为一个问题。saveAs
函数:https://github.com/koffsyrup/FileSaver.js
如果您只想保存文本,则上述脚本在所有浏览器中(包括所有版本的IE)均可使用,无需SWF。data:
URI 并给它一个文件名,同时仍然下载文本。试试这个:
document.getElementById("download").onclick = function(){
var l = document.createElement("a");
l.href = "data:text/plain;charset=UTF-8," + document.getElementById("dload-txt").value;
l.setAttribute("download", document.getElementById("dload-fn").value);
l.click();
}
textarea { width: 200px; height: 75px }
input { width: 200px }
<textarea placeholder="Enter text to download" id="dload-txt"></textarea><br/>
<input placeholder="Enter file name to download as" id="dload-fn"/><br/><br/>
<button id="download">Download</button>
这在大多数浏览器中都有效。
它的作用是从文本区和输入框中获取必要的数据,创建一个链接,该链接的 href
设置为 data:text/plain;UTF-8,<textarea data>
,并设置 download
属性为由 <input>
元素设置的名称。然后点击该链接,将下载文本。
这里唯一不兼容所有浏览器的是:
用于将数据存储为链接的 data:
URI。CanIUse 上的 data: URIs
使用 click()
函数来点击链接。CanIUse 上的 HTMLElement.click()
用于表示下载的 download
属性。CanIUse 上的 download 属性
所以基本上:
function doDownload(str) {
function dataUrl(data) {
return "data:x-application/xml;charset=utf-8," + escape(data);
}
var downloadLink = document.createElement("a");
downloadLink.href = dataUrl(str);
downloadLink.download = "foo.xml";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
通过创建一个框架,编写内容,然后在IE中调用document.execCommand('saveas', ...)
,在Mozilla中使用nsIFilePicker进行一些操作,这可能是可能的,但我相信这需要一些特殊的权限(比如成为浏览器本身的一部分)。
简短的回答:这是不可能的。 你必须将其POST到服务器,并从服务器响应可以是“Content-disposition: attachment”。