Я использую NestJS, Node и Express для моего бэкэнда и Angular для моего веб-интерфейса.У меня есть степпер, где пользователь переходит и вводит информацию о себе, а также фотографию профиля и любые фотографии своего искусства, которые он хочет опубликовать (это черновик).Я отправляю файлы на сервер с этим кодом:
<h2>Upload Some Photos</h2>
<label for="singleFile">Upload file</label>
<input id="singleFile" type="file" [fileUploadInputFor]= "fileUploadQueue"/>
<br>
<mat-file-upload-queue #fileUploadQueue
[fileAlias]="'file'"
[httpUrl]="'http://localhost:3000/profile/artPhotos'">
<mat-file-upload [file]="file" [id]="i" *ngFor="let file of fileUploadQueue.files; let i = index"></mat-file-upload>
</mat-file-upload-queue>
Внешний интерфейс отправляет фотографии в виде массива файлов;Я попытался изменить это так, чтобы это только послало единственный файл, но не могло заставить это работать.Я менее сосредоточен на этом, потому что пользователю может понадобиться загрузить несколько файлов, поэтому я хочу выяснить это независимо.На сервере я использую multer, multer-s3 и AWS-SDK, чтобы помочь загружать файлы, однако это не работает.Вот код контроллера:
@Post('/artPhotos')
@UseInterceptors(FilesInterceptor('file'))
async uploadArtPhotos(@Req() req, @Res() res): Promise<void> {
req.file = req.files[0];
delete req.files;
// tslint:disable-next-line:no-console
console.log(req);
await this._profileService.fileupload(req, res);
}
Вот ProfileService:
import { Profile } from './profile.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { ProfileDto } from './dto/profile.dto';
import { Req, Res, Injectable, UploadedFile } from '@nestjs/common';
import * as multer from 'multer';
import * as AWS from 'aws-sdk';
import * as multerS3 from 'multer-s3';
const AWS_S3_BUCKET_NAME = 'blah';
const s3 = new AWS.S3();
AWS.config.update({
accessKeyId: 'blah',
secretAccessKey: 'blah',
});
@Injectable()
export class ProfileService {
constructor(@InjectRepository(Profile)
private readonly profileRepository: Repository<Profile> ){}
async createProfile( profileDto: ProfileDto ): Promise<void> {
await this.profileRepository.save(profileDto);
}
async fileupload(@Req() req, @Res() res): Promise<void> {
try {
this.upload(req, res, error => {
if (error) {
// tslint:disable-next-line:no-console
console.log(error);
return res.status(404).json(`Failed to upload image file: ${error}`);
}
// tslint:disable-next-line:no-console
console.log('error');
return res.status(201).json(req.file);
});
} catch (error) {
// tslint:disable-next-line:no-console
console.log(error);
return res.status(500).json(`Failed to upload image file: ${error}`);
}
}
upload = multer({
storage: multerS3({
// tslint:disable-next-line:object-literal-shorthand
s3: s3,
bucket: AWS_S3_BUCKET_NAME,
acl: 'public-read',
// tslint:disable-next-line:object-literal-shorthand
key: (req, file, cb) => {
cb(null, `${Date.now().toString()} - ${file.originalname}`);
},
}),
}).array('upload', 1);
}
Я не реализовал мультер, расширяющий промежуточное программное обеспечение, но я не думаю, что должен.Вы можете видеть в контроллере, что я удаляю свойство files в req и заменяю его файлом, значение которого является просто первым членом массива files, но это было просто для того, чтобы увидеть, сработает ли оно, если я отправлю ему что-то, что он ожидал,но это не сработало тогда.У кого-нибудь есть идеи относительно того, как я могу это исправить?Или кто-нибудь может, по крайней мере, указать мне правильное направление со ссылкой на соответствующий учебник или что-то?