Dan*_*man 63
为了完整起见,OP并未声明他希望在浏览器中执行此操作(如果他是,如上所述,通常不可能)
但是javascript本身确实允许这样做; 它可以通过服务器端javascript完成.
编辑:该链接指向现在已被Oracle移动的Sun文档.
为了跟上时间,请访问FileSystem类的node.js文档:http://nodejs.org/docs/latest/api/fs.html
编辑(2):您现在可以使用HTML5读取客户端文件:http://www.html5rocks.com/en/tutorials/file/dndfiles/
Gar*_*eth 40
不可以.浏览器端的javascript没有权限写入客户端计算机而不必禁用许多安全选项
Tho*_*lds 16
未来就在这里!提案更接近完成,不再是ActiveX或Flash或java.现在我们可以使用:
您可以使用拖放操作将文件导入浏览器或简单的上传控件.用户选择文件后,您可以使用Javascript阅读:http://www.html5rocks.com/en/tutorials/file/dndfiles/
Bre*_*ton 14
这是mozilla提案
http://www-archive.mozilla.org/js/js-file-object.html
这是通过spidermonkey中的编译开关实现的,也是在adobe的extendscript中实现的.另外(我认为)你在firefox扩展中获得了File对象.
rhino有一个(相当粗鲁的)readFile函数 https://developer.mozilla.org/en/Rhino_Shell
对于rhino中更复杂的文件操作,可以使用java.io.File方法.
你不会在浏览器中得到任何这些东西.对于浏览器中的类似功能,您可以使用HTML5中的SQL数据库函数,客户端持久性,cookie和闪存存储对象.
Tem*_*emp 12
此Javascript函数向通过浏览器运行此功能的用户提供完整的"另存为"对话框.用户按下确定并保存文件.
编辑:以下代码仅适用于IE浏览器,因为Firefox和Chrome已将此代码视为安全问题并阻止其工作.
// content is the data you'll write to file<br/>
// filename is the filename<br/>
// what I did is use iFrame as a buffer, fill it up with text
function save_content_to_file(content, filename)
{
var dlg = false;
with(document){
ir=createElement('iframe');
ir.id='ifr';
ir.location='about.blank';
ir.style.display='none';
body.appendChild(ir);
with(getElementById('ifr').contentWindow.document){
open("text/plain", "replace");
charset = "utf-8";
write(content);
close();
document.charset = "utf-8";
dlg = execCommand('SaveAs', false, filename+'.txt');
}
body.removeChild(ir);
}
return dlg;
}
Run Code Online (Sandbox Code Playgroud)
调用函数:
save_content_to_file("Hello", "C:\\test");
Run Code Online (Sandbox Code Playgroud)
目前,可以使用File,FileWriter和FileSystem API 从浏览器选项卡/窗口的上下文中编写和读取文件,尽管它们的使用有一些警告(参见本答案的尾部).
但要回答你的问题:
使用BakedGoods*
写文件:
bakedGoods.set({
data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
Run Code Online (Sandbox Code Playgroud)
阅读文件:
bakedGoods.get({
data: ["testFile"],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(resultDataObj, byStorageTypeErrorObj){}
});
Run Code Online (Sandbox Code Playgroud)
使用原始文件,FileWriter和FileSystem API
写文件:
function onQuotaRequestSuccess(grantedQuota)
{
function saveFile(directoryEntry)
{
function createFileWriter(fileEntry)
{
function write(fileWriter)
{
var dataBlob = new Blob(["Hello world!"], {type: "text/plain"});
fileWriter.write(dataBlob);
}
fileEntry.createWriter(write);
}
directoryEntry.getFile(
"testFile",
{create: true, exclusive: true},
createFileWriter
);
}
requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile);
}
var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);
Run Code Online (Sandbox Code Playgroud)
阅读文件:
function onQuotaRequestSuccess(grantedQuota)
{
function getfile(directoryEntry)
{
function readFile(fileEntry)
{
function read(file)
{
var fileReader = new FileReader();
fileReader.onload = function(){var fileData = fileReader.result};
fileReader.readAsText(file);
}
fileEntry.file(read);
}
directoryEntry.getFile(
"testFile",
{create: false},
readFile
);
}
requestFileSystem(Window.PERSISTENT, grantedQuota, getFile);
}
var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);
Run Code Online (Sandbox Code Playgroud)
你问的对吗?也许,也许不是.后两个API:
此外,FileSystem规范没有定义如何在磁盘上显示目录结构.例如,在基于Chromium的浏览器中,沙箱具有一个虚拟文件系统(一种目录结构,它不一定以与从浏览器中访问时相同的形式存在于磁盘上),其中的目录和文件是使用放置了API.
因此,虽然您可以使用API将文件写入系统,但是在没有API的情况下定位文件(好吧,没有FileSystem API)可能是一件非常重要的事情.
如果您可以处理这些问题/限制,那么这些API几乎是您提出要求的唯一原生方式.
如果您对非原生解决方案持开放态度,Silverlight还允许通过IsolatedStorage从选项卡/窗口竞赛中获取文件i/o .但是,托管代码需要使用此功能; 需要编写此类代码的解决方案超出了本问题的范围.
当然,一个使用补充托管代码的解决方案,只留下一个只写Javascript的解决方案,完全在这个问题的范围内;):
//Write file to first of either FileSystem or IsolatedStorage
bakedGoods.set({
data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
storageTypes: ["fileSystem", "silverlight"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
Run Code Online (Sandbox Code Playgroud)
*BakedGoods是一个Javascript库,它建立了一个统一的接口,可用于在所有本机和一些非本机存储设施中执行常见的存储操作.它由这个人维持在这里:).
小智 7
对于Firefox:
var file = Components.classes["@mozilla.org/file/local;1"].
createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("/home");
Run Code Online (Sandbox Code Playgroud)
请参阅https://developer.mozilla.org/en-US/docs/Code_snippets/File_I_O
对于其他人,请查看TiddlyWiki应用程序以了解它是如何做到的.
在浏览器上下文中,Javascript 可以读取用户指定的文件。请参阅埃里克·比德曼 (Eric Bidelman) 的博客使用 File API 读取文件的详细信息,。但是,基于浏览器的 Javascript 无法在不禁用某些安全设置的情况下写入本地计算机的文件系统,因为任何网站都将任意更改本地文件系统视为安全威胁。
话虽如此,有一些方法可以解决它,具体取决于您要执行的操作:
如果是你自己的站点,你可以在网页中嵌入一个Java Applet。但是,访问者必须在本地机器上安装 Java,并会收到安全风险警报。访问者必须允许加载小程序。Java Applet 就像一个可执行软件,可以完全访问本地计算机。
Chrome 支持文件系统,它是本地文件系统的沙盒部分。有关详细信息,请参阅此页面。这为您在本地临时保存东西提供了可能。但是,其他浏览器不支持此功能。
如果你不限于浏览器,Node.js 有一个完整的文件系统接口。请参阅此处了解其文件系统文档。请注意,Node.js 不仅可以在服务器上运行,还可以在任何客户端计算机上运行,包括 Windows。javascript 测试运行程序 Karma 基于 Node.js。如果您只想在本地计算机上使用 javascript 编程,这是一个选项。
为那些想要从 javascript 下载包含特定内容的文件的人编写此答案。我也在为同样的事情而苦苦挣扎。
const data = {name: 'Ronn', age: 27}; //sample json
const a = document.createElement('a');
const blob = new Blob([JSON.stringify(data)]);
a.href = URL.createObjectURL(blob);
a.download = 'sample-profile'; //filename to download
a.click();
Run Code Online (Sandbox Code Playgroud)
在此处查看 Blob 文档 - Blob MDN