我正在为网站原型工作(仅基于浏览器)。有一部分我需要上传一些文件。这里我使用的是 JavaScript 和 HTML。
每当用户想要上传(如应用程序中的“浏览”按钮)一些文件时,它将可供下次使用。我无法做到这一点。
问题我们可以仅在浏览器中使用 JavaScript/HTML 保存/存储/上传文件(不是服务器)吗?
谢谢
我正在为网站原型工作(仅基于浏览器)。有一部分我需要上传一些文件。这里我使用的是 JavaScript 和 HTML。
每当用户想要上传(如应用程序中的“浏览”按钮)一些文件时,它将可供下次使用。我无法做到这一点。
问题我们可以仅在浏览器中使用 JavaScript/HTML 保存/存储/上传文件(不是服务器)吗?
谢谢
如果您通过保存/存储直接到用户的计算机/文件系统,那么不,由于安全原因,这是不可能的。
但是,您可以启动下载,该下载将弹出“另存为”类型的请求者,并允许用户接受或拒绝下载文件。
启动下载的方法不止一种。一个有趣的是锚标记的新download
属性,您可以在其中指定文件名以及自动启动下载,将其设置href
为data-uri或您想要参考下载的其他内容:
<a href="urlToFile" download="myFile.ext">Click to download</a>
如果您只是想在本地保存文件,您可以使用许多本地存储机制之一,例如:
请注意,所有这些都是沙盒的,并且只能在浏览器中使用,它们的来源与它们的写入来源相同。数据可能会或可能不会在任何时候被丢弃(由用户或浏览器),因此它们不是“安全”存储(始终保留服务器副本或重新生成数据的方式)。
是的,可以通过FileSystem API(目前只有 Chrome 和 Opera)。
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
document.querySelector('input[type="file"]').onchange = function(e) {
var files = this.files;
window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
// Duplicate each file the user selected to the app's fs.
for (var i = 0, file; file = files[i]; ++i) {
// Capture current iteration's file in local scope for the getFile() callback.
(function(f) {
fs.root.getFile(f.name, {create: true, exclusive: true}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.write(f); // Note: write() can take a File or Blob object.
}, errorHandler);
}, errorHandler);
})(file);
}
}, errorHandler);
};