handleMultipartFormdata function

Future<FormData> handleMultipartFormdata(
  1. HttpRequest request,
  2. String boundary,
  3. FormData formData
)

Implementation

Future<FormData> handleMultipartFormdata(
    HttpRequest request, String boundary, FormData formData) async {
  final mimeTransformer = MimeMultipartTransformer(boundary);
  final parts = request.cast<List<int>>().transform(mimeTransformer);

  await for (final part in parts) {
    final headers = part.headers;
    final contentType = headers['content-type'];
    final contentDisposition = headers['content-disposition'];
    final nameMatch =
        RegExp(r'name="([^"]*)"').firstMatch(contentDisposition ?? '');
    final fieldName = nameMatch?.group(1);
    final filenameMatch =
        RegExp(r'filename="([^"]*)"').firstMatch(contentDisposition ?? '');
    final filename = filenameMatch?.group(1);

    if (fieldName != null) {
      if (contentType != null || filename != null) {
        // Stream file to temporary storage
        final fileInfo = await _streamToStorage(part,
            originalFilename: filename, customFilePath: null);

        Map<String, dynamic> fieldData = {
          'path': fileInfo['path'],
          'mimeType': contentType,
          'originalname': filename,
          'fieldName': fieldName,
          'size': fileInfo['size'],
          'tempFilename': fileInfo['tempFilename'],
        };
        formData.append(fieldName, json.encode(fieldData));
      } else {
        // Handle plain text data as string
        final content = await utf8.decoder.bind(part).join();
        formData.append(fieldName, content);
      }
    }
  }

  return formData;
}