#node.js #typescript #file-upload #formidable
#node.js #typescript #загрузка файла #грозный
Вопрос:
Я создал базовый веб-сайт для загрузки файлов, используя грозный. Средство загрузки файлов работает на моем локальном хосте, однако, когда другие устройства используют мой веб-сайт для загрузки файлов, оно не работает, и я получаю сообщение об ошибке await fs.writeFile(newPath, rawData);
. Я проверил files
объект грозного, и files.name
для свойства было установлено значение ''
(при загрузке оно устанавливается на имя файла, но при загрузке другими устройствами оно устанавливается на ''
). Кроме того, когда загружаются другие устройства, файл в пути files.path
всегда пуст.
import express from "express";
import path from "path";
import fs from "fs/promises";
import { Fields, Files, IncomingForm } from "formidable";
const formidable = require("formidable");
const PORT = 8000;
const app = express();
const resourcePath = path.resolve(__dirname, "..", "..", "resources");
app.get("/", async (req, res) => {
res.sendFile(path.resolve(__dirname, "..", "public", "index.html"));
});
app.post("/api/upload", (req, res, next) => {
console.log("/api/ hit");
const form: IncomingForm = new formidable.IncomingForm();
// let form: IncomingForm = formidable({ multiples: true });
form.parse(req, async (err: any, fields: Fields, files: Files) => {
if (err) {
console.log("THERE WAS ERROR!");
next(err);
return;
}
const oldPath: string = files.someExpressFiles.path;
const newPath: string = path.join(
__dirname,
files.someExpressFiles.name
);
// raw data
let rawData: any;
try {
rawData = await fs.readFile(oldPath);
} catch (err) {
console.log("1", err);
}
try {
await fs.writeFile(newPath, rawData);
res.send("Successfully uploaded");
} catch (err) {
console.log("2", err);
}
});
});
Это files
объект грозного, когда загружается компьютер, отличный от моего ноутбука:
files {
someExpressFiles: File {
_events: [Object: null prototype] {},
_eventsCount: 0,
_maxListeners: undefined,
size: 0,
path: 'C:\Users\myName\AppData\Local\Temp\upload_75928c3230dd986d613067faeb3df9ff',
name: '',
type: 'application/octet-stream',
hash: null,
lastModifiedDate: null,
_writeStream: WriteStream {
_writableState: [WritableState],
_events: [Object: null prototype] {},
_eventsCount: 0,
_maxListeners: undefined,
path: 'C:\Users\myName\AppData\Local\Temp\upload_75928c3230dd986d613067faeb3df9ff',
fd: 3,
flags: 'w',
mode: 438,
start: undefined,
autoClose: true,
pos: undefined,
bytesWritten: 0,
closed: false,
[Symbol(kFs)]: [Object],
[Symbol(kCapture)]: false,
[Symbol(kIsPerformingIO)]: false
},
[Symbol(kCapture)]: false
}
}
Мой HTML-файл:
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<h1>Hello World!</h1>
<form action="/api/upload/" enctype="multipart/form-data" method="post">
<!-- <input type="file" multiple /> -->
<input type="file" name="someExpressFiles" multiple="multiple" />
<input type="submit" value="UPLOAD" />
</form>
</body>
</html>
Кто-нибудь знает, почему это происходит, и решение для этого, чтобы загрузка файлов работала с другого устройства?
Ответ №1:
На самом деле ошибок нет. Ошибка, которую я получил, была вызвана ошибкой пользователя из-за плохого дизайна в исходной базе кода, которая выглядела немного иначе, чем код, размещенный здесь. Размещенный здесь код на самом деле работает совершенно нормально.