Мы интегрировали редактор OnlyOffice в наше приложение. Я хочу загрузить файл .docx со своего ПК на сервер OnlyOffice, чтобы мы могли использовать его позже для редактирования. Я отправляю POST-запрос на сервер, используя formdata, но он не работает. Ниже приведен мой код javascript:
app.post('/topic/:id/upload', (req, res) => {
docManager.init(__dirname, req, res);
//docManager.storagePath(''); // mkdir if not exist
const userIp = docManager.curUserHostAddress();
const uploadDir = `./public/${configServer.get('storageFolder')}/${userIp}`;
const form = new formidable.IncomingForm();
form.uploadDir = uploadDir;
form.keepExtensions = true;
form.parse(req, (err, fields, files) => {
const file = files.uploadedFile;
file.name = docManager.getCorrectName(file.name);
if (configServer.get('maxFileSize') < file.size || file.size <= 0) {
fs.unlinkSync(file.path);
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('{ "error": "File size is incorrect"}');
res.end();
return;
}
const exts = [].concat(
configServer.get('viewedDocs'),
configServer.get('editedDocs'),
configServer.get('convertedDocs')
);
const curExt = fileUtility.getFileExtension(file.name);
if (exts.indexOf(curExt) === -1) {
fs.unlinkSync(file.path);
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('{ "error": "File type is not supported"}');
res.end();
return;
}
fs.rename(file.path, `${uploadDir}/${file.name}`, (err2) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
if (err2) {
res.write(`{ "error": "${err2}"}`);
} else {
res.write(`{ "filename": "${file.name}"}`);
const userid = req.query.userid ? req.query.userid : 'uid-1';
const firstname = req.query.firstname ? req.query.firstname : 'Jonn';
const lastname = req.query.lastname ? req.query.lastname : 'Smith';
docManager.saveFileData(file.name, userid, `${firstname} ${lastname}`);
docManager.getFileData(file.name, docManager.curUserHostAddress());
}
res.end();
});
});
});
В начале в вызове form.parse() есть массив файлов. Этот массив поступает как пустой. И, следовательно, я получаю сообщение об ошибке:
TypeError: Невозможно прочитать имя свойства неопределенного
Ниже приведен код моего компонента:
uploadFile(topicId: any, files: File[]) {
this.fileToUpload = files[0];
let apiUrl = "/topic/" + topicId + "/upload";
let headers = new Headers();
headers.append('authorization', 'Bearer ' + localStorage.getItem('id_token'));
headers.append('Access-Control-Allow-Origin', '*');
let data = new FormData();
data.append('file', this.fileToUpload);
this.ooApiService.postUrl(apiUrl, data, {headers})
.toPromise()
.catch(
(error: any) => this.handleError(error)
);
}
HTML-код:
<form action="/upload" enctype="multipart/form-data" method="post">
<input class="chooseFile" id="uploadedFile" type="file" [disabled]="isChosen" #fileInput (change)="chooseImage(fileInput.files)"/>
<button *ngIf="userCanEditDetails" md-raised-button color="primary" (click)="uploadFile(topic.id, fileInput.files)">
{{ "Upload file" | translate }}
</button>
</form>
Я вызываю этот запрос POST из моего клиентского приложения, которое находится в angular2, оттуда я выбираю и передаю файл в качестве данных формы. Может ли кто-нибудь помочь мне решить эту проблему? Заранее спасибо.