@@ -2,13 +2,15 @@ import FormData, { type Stream } from 'form-data';
22import CloudConvert from './CloudConvert' ;
33import { type JobTask } from './JobsResource' ;
44import axios from 'axios' ;
5+ import { ReadStream , statSync } from 'fs' ;
56
67export type TaskEvent = 'created' | 'updated' | 'finished' | 'failed' ;
78export type TaskStatus = 'waiting' | 'processing' | 'finished' | 'error' ;
89
910export interface TaskEventData {
1011 task : Task ;
1112}
13+
1214export interface JobTaskEventData {
1315 task : JobTask ;
1416}
@@ -603,7 +605,8 @@ export default class TasksResource {
603605 async upload (
604606 task : Task | JobTask ,
605607 stream : Stream ,
606- filename : string | null = null
608+ filename : string | null = null ,
609+ size : number | null = null
607610 ) : Promise < any > {
608611 if ( task . operation !== 'import/upload' ) {
609612 throw new Error ( 'The task operation is not import/upload' ) ;
@@ -619,16 +622,25 @@ export default class TasksResource {
619622 formData . append ( parameter , task . result . form . parameters [ parameter ] ) ;
620623 }
621624
622- let fileOptions = { } ;
625+ const fileOptions : { filename ?: string ; knownLength ?: number } = { } ;
626+
623627 if ( filename ) {
624- fileOptions = { filename } ;
628+ fileOptions . filename = filename ;
629+ }
630+ if ( size ) {
631+ fileOptions . knownLength = size ;
632+ } else if ( stream instanceof ReadStream ) {
633+ fileOptions . knownLength = statSync ( stream . path ) . size ;
625634 }
626635 formData . append ( 'file' , stream , fileOptions ) ;
627636
628637 return await axios . post ( task . result . form . url , formData , {
629638 maxContentLength : Infinity ,
630639 maxBodyLength : Infinity ,
631640 headers : {
641+ ...( formData . hasKnownLength ( )
642+ ? { 'Content-Length' : formData . getLengthSync ( ) }
643+ : { } ) ,
632644 ...formData . getHeaders ( )
633645 }
634646 } ) ;
0 commit comments