123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- const fs = require('fs-extra');
- const path = require('path');
- const WebDavFS = require('webdav-fs');
- class RemoteWebDavStorage {
- constructor(config) {
- const opts = Object.assign({}, config);
- this.wfs = WebDavFS(config.url, opts);
- }
- stat(filename) {
- return new Promise((resolve, reject) => {
- this.wfs.stat(filename, function(err, fileStat) {
- if (err)
- reject(err);
- resolve(fileStat);
- });
- });
- }
- writeFile(filename, data) {
- return new Promise((resolve, reject) => {
- this.wfs.writeFile(filename, data, 'binary', function(err) {
- if (err)
- reject(err);
- resolve();
- });
- });
- }
- unlink(filename) {
- return new Promise((resolve, reject) => {
- this.wfs.unlink(filename, function(err) {
- if (err)
- reject(err);
- resolve();
- });
- });
- }
- readFile(filename) {
- return new Promise((resolve, reject) => {
- this.wfs.readFile(filename, 'binary', function(err, data) {
- if (err)
- reject(err);
- resolve(data);
- });
- });
- }
- mkdir(dirname) {
- return new Promise((resolve, reject) => {
- this.wfs.mkdir(dirname, function(err) {
- if (err)
- reject(err);
- resolve();
- });
- });
- }
- async putFile(filename) {
- if (!await fs.pathExists(filename)) {
- throw new Error(`File not found: ${filename}`);
- }
- const base = path.basename(filename);
- let remoteFilename = `/${base}`;
-
- if (base.length > 3) {
- const remoteDir = `/${base.substr(0, 3)}`;
- try {
- await this.mkdir(remoteDir);
- } catch (e) {
- //
- }
- remoteFilename = `${remoteDir}/${base}`;
- }
- try {
- const localStat = await fs.stat(filename);
- const remoteStat = await this.stat(remoteFilename);
- if (remoteStat.isFile && localStat.size == remoteStat.size) {
- return;
- }
- await this.unlink(remoteFilename);
- } catch (e) {
- //
- }
- const data = await fs.readFile(filename);
- await this.writeFile(remoteFilename, data);
- }
- async getFile(filename) {
- if (await fs.pathExists(filename)) {
- return;
- }
- const base = path.basename(filename);
- let remoteFilename = `/${base}`;
- if (base.length > 3) {
- remoteFilename = `/${base.substr(0, 3)}/${base}`;
- }
- const data = await this.readFile(remoteFilename);
- await fs.writeFile(filename, data);
- }
- async getFileSuccess(filename) {
- try {
- await this.getFile(filename);
- return true;
- } catch (e) {
- //
- }
- return false;
- }
- }
- module.exports = RemoteWebDavStorage;
|