@blocklet/uploader-server 0.1.101 → 0.1.102
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/middlewares/local-storage.js +6 -1
- package/es/utils.d.ts +4 -0
- package/es/utils.js +23 -2
- package/lib/middlewares/local-storage.js +5 -0
- package/lib/utils.d.ts +4 -0
- package/lib/utils.js +26 -2
- package/package.json +2 -1
|
@@ -7,7 +7,7 @@ import crypto from "crypto";
|
|
|
7
7
|
import mime from "mime-types";
|
|
8
8
|
import joinUrlLib from "url-join";
|
|
9
9
|
import queue from "p-queue";
|
|
10
|
-
import { setPDFDownloadHeader, logger } from "../utils.js";
|
|
10
|
+
import { setPDFDownloadHeader, logger, removeExifFromFile } from "../utils.js";
|
|
11
11
|
const validFilePathInDirPath = (dirPath, filePath) => {
|
|
12
12
|
const fileName = path.basename(filePath);
|
|
13
13
|
if (!filePath.startsWith(dirPath) || path.join(dirPath, fileName) !== filePath) {
|
|
@@ -85,6 +85,11 @@ export function initLocalStorageServer({
|
|
|
85
85
|
res.setHeader("x-uploader-file-exist", true);
|
|
86
86
|
uploadMetadata = formatMetadata(uploadMetadata);
|
|
87
87
|
await rewriteMetaDataFile(uploadMetadata);
|
|
88
|
+
try {
|
|
89
|
+
await removeExifFromFile(uploadMetadata.runtime.absolutePath);
|
|
90
|
+
} catch (err) {
|
|
91
|
+
logger.error("failed to remove EXIF from file", err);
|
|
92
|
+
}
|
|
88
93
|
if (_onUploadFinish) {
|
|
89
94
|
try {
|
|
90
95
|
const result = await _onUploadFinish(req, res, uploadMetadata);
|
package/es/utils.d.ts
CHANGED
|
@@ -49,4 +49,8 @@ export declare function scanDirectory(directory: string, options?: {
|
|
|
49
49
|
blockletInfo?: any;
|
|
50
50
|
}): Map<string, ResourceFile>;
|
|
51
51
|
export declare function getFileNameFromReq(req: any): any;
|
|
52
|
+
/**
|
|
53
|
+
* Remove EXIF from file
|
|
54
|
+
*/
|
|
55
|
+
export declare const removeExifFromFile: (filePath: string) => Promise<void>;
|
|
52
56
|
export {};
|
package/es/utils.js
CHANGED
|
@@ -4,15 +4,15 @@ import joinUrl from "url-join";
|
|
|
4
4
|
import { isbot } from "isbot";
|
|
5
5
|
import component from "@blocklet/sdk/lib/component";
|
|
6
6
|
import { ImageBinDid } from "./constants.js";
|
|
7
|
-
import { createReadStream } from "fs";
|
|
8
7
|
import crypto from "crypto";
|
|
9
8
|
import { getSignData } from "@blocklet/sdk/lib/util/verify-sign";
|
|
10
9
|
import FormData from "form-data";
|
|
11
10
|
import omit from "lodash/omit";
|
|
12
11
|
import ms from "ms";
|
|
13
12
|
import mime from "mime-types";
|
|
14
|
-
import { existsSync, readdirSync, statSync } from "fs";
|
|
13
|
+
import { existsSync, readdirSync, renameSync, statSync, unlinkSync, createReadStream, createWriteStream } from "fs";
|
|
15
14
|
import { join } from "path";
|
|
15
|
+
import ExifTransformer from "exif-be-gone";
|
|
16
16
|
export let logger = console;
|
|
17
17
|
if (process.env.BLOCKLET_LOG_DIR) {
|
|
18
18
|
try {
|
|
@@ -277,3 +277,24 @@ export function getFileNameFromReq(req) {
|
|
|
277
277
|
const pathname = req.path || req.url?.split("?")[0];
|
|
278
278
|
return path.basename(decodeURIComponent(pathname || ""));
|
|
279
279
|
}
|
|
280
|
+
export const removeExifFromFile = async (filePath) => {
|
|
281
|
+
return new Promise(async (resolve, reject) => {
|
|
282
|
+
try {
|
|
283
|
+
statSync(filePath);
|
|
284
|
+
} catch (e) {
|
|
285
|
+
reject(e);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const tempPath = filePath + ".tmp";
|
|
289
|
+
const reader = createReadStream(filePath);
|
|
290
|
+
const writer = createWriteStream(tempPath);
|
|
291
|
+
reader.pipe(new ExifTransformer()).pipe(writer).on("finish", () => {
|
|
292
|
+
renameSync(tempPath, filePath);
|
|
293
|
+
resolve();
|
|
294
|
+
}).on("error", (err) => {
|
|
295
|
+
logger.error("[exif-be-gone] failed", err);
|
|
296
|
+
unlinkSync(tempPath);
|
|
297
|
+
reject(err);
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
};
|
|
@@ -105,6 +105,11 @@ function initLocalStorageServer({
|
|
|
105
105
|
res.setHeader("x-uploader-file-exist", true);
|
|
106
106
|
uploadMetadata = formatMetadata(uploadMetadata);
|
|
107
107
|
await rewriteMetaDataFile(uploadMetadata);
|
|
108
|
+
try {
|
|
109
|
+
await (0, _utils.removeExifFromFile)(uploadMetadata.runtime.absolutePath);
|
|
110
|
+
} catch (err) {
|
|
111
|
+
_utils.logger.error("failed to remove EXIF from file", err);
|
|
112
|
+
}
|
|
108
113
|
if (_onUploadFinish) {
|
|
109
114
|
try {
|
|
110
115
|
const result = await _onUploadFinish(req, res, uploadMetadata);
|
package/lib/utils.d.ts
CHANGED
|
@@ -49,4 +49,8 @@ export declare function scanDirectory(directory: string, options?: {
|
|
|
49
49
|
blockletInfo?: any;
|
|
50
50
|
}): Map<string, ResourceFile>;
|
|
51
51
|
export declare function getFileNameFromReq(req: any): any;
|
|
52
|
+
/**
|
|
53
|
+
* Remove EXIF from file
|
|
54
|
+
*/
|
|
55
|
+
export declare const removeExifFromFile: (filePath: string) => Promise<void>;
|
|
52
56
|
export {};
|
package/lib/utils.js
CHANGED
|
@@ -11,6 +11,7 @@ exports.getMediaKitFileStream = getMediaKitFileStream;
|
|
|
11
11
|
exports.getTrustedDomainsCache = getTrustedDomainsCache;
|
|
12
12
|
exports.logger = void 0;
|
|
13
13
|
exports.proxyImageDownload = proxyImageDownload;
|
|
14
|
+
exports.removeExifFromFile = void 0;
|
|
14
15
|
exports.scanDirectory = scanDirectory;
|
|
15
16
|
exports.serveResource = serveResource;
|
|
16
17
|
exports.setPDFDownloadHeader = setPDFDownloadHeader;
|
|
@@ -21,13 +22,14 @@ var _urlJoin = _interopRequireDefault(require("url-join"));
|
|
|
21
22
|
var _isbot = require("isbot");
|
|
22
23
|
var _component = _interopRequireDefault(require("@blocklet/sdk/lib/component"));
|
|
23
24
|
var _constants = require("./constants");
|
|
24
|
-
var _fs = require("fs");
|
|
25
25
|
var _crypto = _interopRequireDefault(require("crypto"));
|
|
26
26
|
var _verifySign = require("@blocklet/sdk/lib/util/verify-sign");
|
|
27
27
|
var _formData = _interopRequireDefault(require("form-data"));
|
|
28
28
|
var _omit = _interopRequireDefault(require("lodash/omit"));
|
|
29
29
|
var _ms = _interopRequireDefault(require("ms"));
|
|
30
30
|
var _mimeTypes = _interopRequireDefault(require("mime-types"));
|
|
31
|
+
var _fs = require("fs");
|
|
32
|
+
var _exifBeGone = _interopRequireDefault(require("exif-be-gone"));
|
|
31
33
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
32
34
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
33
35
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -300,4 +302,26 @@ function scanDirectory(directory, options = {}) {
|
|
|
300
302
|
function getFileNameFromReq(req) {
|
|
301
303
|
const pathname = req.path || req.url?.split("?")[0];
|
|
302
304
|
return _path.default.basename(decodeURIComponent(pathname || ""));
|
|
303
|
-
}
|
|
305
|
+
}
|
|
306
|
+
const removeExifFromFile = async filePath => {
|
|
307
|
+
return new Promise(async (resolve, reject) => {
|
|
308
|
+
try {
|
|
309
|
+
(0, _fs.statSync)(filePath);
|
|
310
|
+
} catch (e) {
|
|
311
|
+
reject(e);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const tempPath = filePath + ".tmp";
|
|
315
|
+
const reader = (0, _fs.createReadStream)(filePath);
|
|
316
|
+
const writer = (0, _fs.createWriteStream)(tempPath);
|
|
317
|
+
reader.pipe(new _exifBeGone.default()).pipe(writer).on("finish", () => {
|
|
318
|
+
(0, _fs.renameSync)(tempPath, filePath);
|
|
319
|
+
resolve();
|
|
320
|
+
}).on("error", err => {
|
|
321
|
+
logger.error("[exif-be-gone] failed", err);
|
|
322
|
+
(0, _fs.unlinkSync)(tempPath);
|
|
323
|
+
reject(err);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
};
|
|
327
|
+
exports.removeExifFromFile = removeExifFromFile;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blocklet/uploader-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.102",
|
|
4
4
|
"description": "blocklet upload server",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -58,6 +58,7 @@
|
|
|
58
58
|
"@uppy/companion": "4.15.1",
|
|
59
59
|
"axios": "^1.7.8",
|
|
60
60
|
"body-parser": "^1.20.3",
|
|
61
|
+
"exif-be-gone": "^1.5.1",
|
|
61
62
|
"express-session": "1.17.3",
|
|
62
63
|
"glob": "^11.0.1",
|
|
63
64
|
"isbot": "^5.1.17",
|