aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app/+videos/+video-edit/video-add-components/uploaderx-form-data.ts
blob: 3392a0d8ace6cda8ea2f88d1eb14270e7e61d154 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import { objectToFormData } from '@app/helpers'
import { resolveUrl, UploaderX } from 'ngx-uploadx'

/**
 * multipart/form-data uploader extending the UploaderX implementation of Google Resumable
 * for use with multer
 *
 * @see https://github.com/kukhariev/ngx-uploadx/blob/637e258fe366b8095203f387a6101a230ee4f8e6/src/uploadx/lib/uploaderx.ts
 * @example
 *
 *   options: UploadxOptions = {
 *     uploaderClass: UploaderXFormData
 *   };
 */
export class UploaderXFormData extends UploaderX {

  async getFileUrl (): Promise<string> {
    const headers = {
      'X-Upload-Content-Length': this.size.toString(),
      'X-Upload-Content-Type': this.file.type || 'application/octet-stream'
    }

    const previewfile = this.metadata.previewfile as any as File
    delete this.metadata.previewfile

    const data = objectToFormData(this.metadata)
    if (previewfile !== undefined) {
      data.append('previewfile', previewfile, previewfile.name)
      data.append('thumbnailfile', previewfile, previewfile.name)
    }

    await this.request({
      method: 'POST',
      body: data,
      url: this.endpoint,
      headers
    })

    const location = this.getValueFromResponse('location')
    if (!location) {
      throw new Error('Invalid or missing Location header')
    }

    this.offset = this.responseStatus === 201 ? 0 : undefined

    return resolveUrl(location, this.endpoint)
  }
}