changeAvatar () {
const avatarfile = this.avatarfileInput.nativeElement.files[ 0 ]
+ if (avatarfile.size > this.maxAvatarSize) {
+ this.notificationsService.error('Error', 'This image is too large.')
+ return
+ }
const formData = new FormData()
formData.append('avatarfile', avatarfile)
data => {
this.notificationsService.success(this.i18n('Success'), this.i18n('Avatar changed.'))
- this.user.account.avatar = data.avatar
+ this.user.updateAccountAvatar(data.avatar)
},
err => this.notificationsService.error(this.i18n('Error'), err.message)
import { NSFWPolicyType } from '../../../../../shared/models/videos/nsfw-policy.type'
import { Actor } from '@app/shared/actor/actor.model'
import { Account } from '@app/shared/account/account.model'
+import { Avatar } from '../../../../../shared/models/avatars/avatar.model'
export type UserConstructorHash = {
id: number,
this.updateComputedAttributes()
}
+ updateAccountAvatar (newAccountAvatar: Avatar) {
+ this.account.avatar = newAccountAvatar
+
+ this.updateComputedAttributes()
+ }
+
private updateComputedAttributes () {
this.accountAvatarUrl = Actor.GET_ACTOR_AVATAR_URL(this.account)
}
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'
import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'
import { ServerService } from '@app/core'
+import { NotificationsService } from 'angular2-notifications'
+import { I18n } from '@ngx-translate/i18n-polyfill'
@Component({
selector: 'my-video-image',
constructor (
private sanitizer: DomSanitizer,
- private serverService: ServerService
+ private serverService: ServerService,
+ private notificationsService: NotificationsService,
+ private i18n: I18n
) {}
get videoImageExtensions () {
if (event.target.files && event.target.files.length) {
const [ file ] = event.target.files
+ if (file.size > this.maxVideoImageSize) {
+ this.notificationsService.error(this.i18n('Error'), this.i18n('This image is too large.'))
+ return
+ }
+
this.file = file
this.propagateChange(this.file)
this.updatePreview()
files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[],
mimeTypeRegex: string,
field: string,
+ maxSize: number,
optional = false
) {
// Should have files
const file = fileArray[ 0 ]
if (!file || !file.originalname) return false
+ // Check size
+ if (maxSize && file.size > maxSize) return false
+
return new RegExp(`^${mimeTypeRegex}$`, 'i').test(file.mimetype)
}
import * as validator from 'validator'
import { UserRole } from '../../../shared'
import { CONSTRAINTS_FIELDS, NSFW_POLICY_TYPES } from '../../initializers'
-
import { exists, isFileValid } from './misc'
import { values } from 'lodash'
.join('|')
const avatarMimeTypesRegex = `image/(${avatarMimeTypes})`
function isAvatarFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
- return isFileValid(files, avatarMimeTypesRegex, 'avatarfile')
+ return isFileValid(files, avatarMimeTypesRegex, 'avatarfile', CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max)
}
// ---------------------------------------------------------------------------
const videoFileTypesRegex = videoFileTypes.join('|')
function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
- return isFileValid(files, videoFileTypesRegex, 'videofile')
+ return isFileValid(files, videoFileTypesRegex, 'videofile', null)
}
const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
const videoImageTypesRegex = `image/(${videoImageTypes})`
function isVideoImage (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) {
- return isFileValid(files, videoImageTypesRegex, field, true)
+ return isFileValid(files, videoImageTypesRegex, field, CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max, true)
}
function isVideoPrivacyValid (value: number) {
const usersUpdateMyAvatarValidator = [
body('avatarfile').custom((value, { req }) => isAvatarFile(req.files)).withMessage(
- 'This file is not supported. Please, make sure it is of the following type : '
+ 'This file is not supported or too large. Please, make sure it is of the following type : '
+ CONSTRAINTS_FIELDS.ACTORS.AVATAR.EXTNAME.join(', ')
),
if (areValidationErrors(req, res)) return
- const imageFile = req.files['avatarfile'][0] as Express.Multer.File
- if (imageFile.size > CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max) {
- res.status(400)
- .send({ error: `The size of the avatar is too big (>${CONSTRAINTS_FIELDS.ACTORS.AVATAR.FILE_SIZE.max}).` })
- .end()
- return
- }
-
return next()
}
]
import { areValidationErrors } from './utils'
const videosAddValidator = [
- body('videofile').custom((value, { req }) => isVideoFile(req.files)).withMessage(
- 'This file is not supported. Please, make sure it is of the following type : '
- + CONSTRAINTS_FIELDS.VIDEOS.EXTNAME.join(', ')
- ),
- body('thumbnailfile').custom((value, { req }) => isVideoImage(req.files, 'thumbnailfile')).withMessage(
- 'This thumbnail file is not supported. Please, make sure it is of the following type : '
- + CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
- ),
- body('previewfile').custom((value, { req }) => isVideoImage(req.files, 'previewfile')).withMessage(
- 'This preview file is not supported. Please, make sure it is of the following type : '
- + CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
- ),
+ body('videofile')
+ .custom((value, { req }) => isVideoFile(req.files)).withMessage(
+ 'This file is not supported or too large. Please, make sure it is of the following type : '
+ + CONSTRAINTS_FIELDS.VIDEOS.EXTNAME.join(', ')
+ ),
+ body('thumbnailfile')
+ .custom((value, { req }) => isVideoImage(req.files, 'thumbnailfile')).withMessage(
+ 'This thumbnail file is not supported or too large. Please, make sure it is of the following type : '
+ + CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
+ ),
+ body('previewfile')
+ .custom((value, { req }) => isVideoImage(req.files, 'previewfile')).withMessage(
+ 'This preview file is not supported or too large. Please, make sure it is of the following type : '
+ + CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
+ ),
body('name').custom(isVideoNameValid).withMessage('Should have a valid name'),
body('category')
.optional()
const videosUpdateValidator = [
param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'),
- body('thumbnailfile').custom((value, { req }) => isVideoImage(req.files, 'thumbnailfile')).withMessage(
- 'This thumbnail file is not supported. Please, make sure it is of the following type : '
- + CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
- ),
- body('previewfile').custom((value, { req }) => isVideoImage(req.files, 'previewfile')).withMessage(
- 'This preview file is not supported. Please, make sure it is of the following type : '
- + CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
- ),
+ body('thumbnailfile')
+ .custom((value, { req }) => isVideoImage(req.files, 'thumbnailfile')).withMessage(
+ 'This thumbnail file is not supported or too large. Please, make sure it is of the following type : '
+ + CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
+ ),
+ body('previewfile')
+ .custom((value, { req }) => isVideoImage(req.files, 'previewfile')).withMessage(
+ 'This preview file is not supported or too large. Please, make sure it is of the following type : '
+ + CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME.join(', ')
+ ),
body('name')
.optional()
.custom(isVideoNameValid).withMessage('Should have a valid name'),
const fields = baseCorrectParams
const attaches = {
'thumbnailfile': join(__dirname, '..', '..', 'fixtures', 'avatar.png'),
- 'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short_fake.webm')
+ 'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
}
await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
const fields = baseCorrectParams
const attaches = {
'thumbnailfile': join(__dirname, '..', '..', 'fixtures', 'avatar-big.png'),
- 'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short_fake.webm')
+ 'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
}
await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
const fields = baseCorrectParams
const attaches = {
'previewfile': join(__dirname, '..', '..', 'fixtures', 'avatar.png'),
- 'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short_fake.webm')
+ 'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
}
await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
const fields = baseCorrectParams
const attaches = {
'previewfile': join(__dirname, '..', '..', 'fixtures', 'avatar-big.png'),
- 'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short_fake.webm')
+ 'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
}
await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })