uploadFile method

Future<void> uploadFile(
  1. String outPath
)

upload from client

Implementation

Future<void> uploadFile(String outPath) async {
  try {
    final contentType = headers.contentType;
    if (contentType == null ||
        !contentType.mimeType.startsWith('multipart/form-data')) {
      response
        ..statusCode = HttpStatus.unsupportedMediaType
        ..write('Only multipart/form-data supported')
        ..close();
      return;
    }

    // parse multipart form
    final transformer = MimeMultipartTransformer(
      contentType.parameters['boundary']!,
    );
    final bodyStream = cast<List<int>>().transform(transformer);

    await for (MimeMultipart part in bodyStream) {
      final headers = part.headers;
      if (headers['content-disposition'] != null &&
          headers['content-disposition']!.contains('filename=')) {
        // extract filename
        final contentDisposition = headers['content-disposition']!;
        final filename =
            RegExp(
              r'filename="(.+)"',
            ).firstMatch(contentDisposition)?.group(1) ??
            'upload_${DateTime.now().millisecondsSinceEpoch}';

        final file = File('$outPath/$filename');
        await file.create(recursive: true);

        final sink = file.openWrite();
        await part.pipe(sink);
        await sink.close();
        TLogger.instance.showLog(
          "Uploaded file: ${file.path}",
          tag: 'uploadFile',
        );
      }
    }

    response
      ..statusCode = HttpStatus.ok
      ..write('Upload successful')
      ..close();
  } catch (e) {
    TLogger.instance.showLog(e.toString(), tag: 'uploadFile');
    response
      ..statusCode = HttpStatus.internalServerError
      ..write('Server Error')
      ..close();
  }
}