Lokal filåtkomst med JavaScript
Finns det lokal filhantering som har gjorts med JavaScript? Jag letar efter en lösning som kan genomföras utan att installera något, som att kräva Adobe AIR.
Specifikt skulle jag vilja läsa innehållet från en fil och skriva detta innehåll till en annan fil. Just nu är jag inte orolig för att få behörigheter och antar bara att jag redan har full behörighet till dessa filer.
Svar #1
Bara en uppdatering av HTML5-funktionerna finns på http://www.html5rocks.com/en/tutorials/file/dndfiles/. Denna utmärkta artikel förklarar i detalj lokal filåtkomst i JavaScript. Sammanfattning från den nämnda artikeln:
Specifikationen tillhandahåller flera gränssnitt för att komma åt filer från ett 'lokalt' filsystem:
- Fil - en individuell fil; tillhandahåller bara läsbar information såsom namn, filstorlek, MIME-typ och en referens till filhandtaget.
- FileList - en array-liknande sekvens av File-objekt. (Tänk
<input type="file" multiple>eller att dra en mapp med filer från skrivbordet). - Blob - Gör det möjligt att dela upp en fil i bytere.
Se Paul D. Waites kommentar nedan.
Svar #2
Om användaren väljer en fil via <input type="file"> kan du läsa och bearbeta den filen med hjälp av File API.
Att läsa eller skriva godtyckliga filer är inte tillåtet enligt design. Det är ett brott mot sandlådan. Från Wikipedia -> Javascript -> Säkerhet:
JavaScript och DOM ger möjligheten för illvilliga författare att leverera skript som körs på en klientdator via webben. Webbläsarförfattare begränsar denna risk med två begränsningar. För det första körs skript i en sandbox där de endast kan utföra webbrelaterade åtgärder, inte allmänna programmeringsuppgifter som skapa filer.
UPPDATERING 2016: Att komma åt filsystemet direkt är möjligt via Filesystem API, som endast stöds av Chrome och Opera och kanske inte implementeras av andra webbläsare (med undantag för Edge). För detaljer se Kevins svar.
Svar #3
Som tidigare nämnts kan FileSystem- och File-API:erna, tillsammans med FileWriter-API:et, användas för att läsa och skriva filer från ett webbläsarfliks-/fönstersammanhang till en klientdator.
Det finns flera saker som rör FileSystem- och FileWriter-API:erna som du bör vara medveten om, några av dem nämndes, men är värda att upprepa:
- Implementationer av API:erna finns för närvarande endast i Chromium-baserade webbläsare (Chrome & Opera)
- Båda API:erna togs bort från W3C:s standardspår den 24 april 2014, och är för närvarande proprietära
- Borttagning av de (nu proprietära) API:erna från implementerande webbläsare i framtiden är en möjlighet
- En sandbox (en plats på disken utanför vilken filer inte kan ha någon effekt) används för att lagra de filer som skapas med API:erna
- Ett virtuellt filsystem (en katalogstruktur som inte nödvändigtvis finns på disk i samma form som när det nås från webbläsaren) används för att representera filerna som skapats med API:erna
Här är enkla exempel på hur API:erna används, direkt och indirekt, tillsammans för att göra dessa saker:
Bakverk*
Skriv fil:
bakedGoods.set({
data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
Läs fil:
bakedGoods.get({
data: ["testFile"],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(resultDataObj, byStorageTypeErrorObj){}
});
Använda de råa File-, FileWriter- och FileSystem-API:erna
Skriv fil:
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);
Läs fil:
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);
Även om FileSystem- och FileWriter-API:erna inte längre följer standardspåret, kan deras användning i vissa fall motiveras, enligt min åsikt, eftersom:
- Förnyat intresse från de webbläsartillverkare som inte har implementerat det kan placera dem precis tillbaka på det
- Marknadspenetrationen av att implementera (Chromium-baserade) webbläsare är hög
- Google (huvudbidragsgivaren till Chromium) har inte angett något slutdatum för API:erna
Huruvida "vissa fall" omfattar ditt eget fall är dock upp till dig att avgöra.
*BakedGoods underhålls av ingen mindre än den här killen här :)
Svar #4
UPPDATERING Denna funktion har tagits bort sedan Firefox 17 (se https://bugzilla.mozilla.org/show_bug.cgi?id=546848).
I Firefox kan du (programmeraren) göra detta från en JavaScript-fil:
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");
och du (webbläsaranvändaren) kommer att bli ombedd att tillåta åtkomst. (för Firefox behöver du bara göra detta en gång varje gång webbläsaren startas)
Om webbläsaranvändaren är någon annan måste de ge tillstånd.
Svar #5
NW.js låter dig skapa skrivbordsapplikationer med Javascript utan alla de säkerhetsbegränsningar som vanligtvis gäller i webbläsaren. Så du kan köra körbara filer med en funktion, eller skapa/redigera/läsa/skriver/spara/filer. Du kan få tillgång till hårdvaran, såsom aktuell CPU-användning eller totalt RAM i användning, etc.
Du kan skapa en Windows-, Linux- eller Mac-skrivbordsapplikation med det som inte kräver någon installation.
- http://nwjs.io
