@@ -61,7 +61,11 @@ bool _isMultipartFormData(ContentType? contentType) {
6161}
6262
6363FormData _extractFormUrlEncodedFormData ({required String body}) {
64- return FormData (fields: Uri .splitQueryString (body), files: {});
64+ final query = Uri .splitQueryString (body);
65+ final fields = < String , List <String >> {};
66+
67+ query.forEach ((k, v) => fields.putIfAbsent (k, () => []).add (v));
68+ return FormData (fields: fields, files: {});
6569}
6670
6771final _keyValueRegexp = RegExp ('(?:(?<key>[a-zA-Z0-9-_]+)="(?<value>.*?)";*)+' );
@@ -75,8 +79,8 @@ Future<FormData> _extractMultipartFormData({
7579 final boundary = mediaType.parameters['boundary' ];
7680 final transformer = MimeMultipartTransformer (boundary! );
7781
78- final fields = < String , String > {};
79- final files = < String , UploadedFile > {};
82+ final fields = < String , List < String > > {};
83+ final files = < String , List < UploadedFile > > {};
8084
8185 await for (final part in transformer.bind (bytes)) {
8286 final contentDisposition = part.headers['content-disposition' ];
@@ -93,14 +97,16 @@ Future<FormData> _extractMultipartFormData({
9397 final fileName = values['filename' ];
9498
9599 if (fileName != null ) {
96- files[name] = UploadedFile (
97- fileName,
98- ContentType .parse (part.headers['content-type' ] ?? 'text/plain' ),
99- part,
100- );
100+ files.putIfAbsent (name, () => []).add (
101+ UploadedFile (
102+ fileName,
103+ ContentType .parse (part.headers['content-type' ] ?? 'text/plain' ),
104+ part,
105+ ),
106+ );
101107 } else {
102108 final bytes = (await part.toList ()).fold (< int > [], (p, e) => p..addAll (e));
103- fields[ name] = utf8.decode (bytes);
109+ fields. putIfAbsent ( name, () => []). add ( utf8.decode (bytes) );
104110 }
105111 }
106112
@@ -110,41 +116,41 @@ Future<FormData> _extractMultipartFormData({
110116/// {@template form_data}
111117/// The fields and files of received form data request.
112118/// {@endtemplate}
113- class FormData with MapMixin <String , String > {
119+ class FormData with MapMixin <String , List < String > > {
114120 /// {@macro form_data}
115121 const FormData ({
116- required Map <String , String > fields,
117- required Map <String , UploadedFile > files,
122+ required Map <String , List < String > > fields,
123+ required Map <String , List < UploadedFile > > files,
118124 }) : _fields = fields,
119125 _files = files;
120126
121- final Map <String , String > _fields;
127+ final Map <String , List < String > > _fields;
122128
123- final Map <String , UploadedFile > _files;
129+ final Map <String , List < UploadedFile > > _files;
124130
125131 /// The fields that were submitted in the form.
126- Map <String , String > get fields => Map .unmodifiable (_fields);
132+ Map <String , List < String > > get fields => Map .unmodifiable (_fields);
127133
128134 /// The files that were uploaded in the form.
129- Map <String , UploadedFile > get files => Map .unmodifiable (_files);
135+ Map <String , List < UploadedFile > > get files => Map .unmodifiable (_files);
130136
131137 @override
132138 @Deprecated ('Use `fields[key]` to retrieve values' )
133- String ? operator [](Object ? key) => _fields[key] ?? _files[key] ? . toString () ;
139+ List < String > ? operator [](Object ? key) => _fields[key];
134140
135141 @override
136142 @Deprecated ('Use `fields.keys` to retrieve field keys' )
137143 Iterable <String > get keys => _fields.keys;
138144
139145 @override
140146 @Deprecated ('Use `fields.values` to retrieve field values' )
141- Iterable <String > get values => _fields.values;
147+ Iterable <List < String > > get values => _fields.values;
142148
143149 @override
144150 @Deprecated (
145151 'FormData should be immutable, in the future this will thrown an error' ,
146152 )
147- void operator []= (String key, String value) => _fields[key] = value;
153+ void operator []= (String key, List < String > value) => _fields[key] = value;
148154
149155 @override
150156 @Deprecated (
@@ -156,7 +162,7 @@ class FormData with MapMixin<String, String> {
156162 @Deprecated (
157163 'FormData should be immutable, in the future this will thrown an error' ,
158164 )
159- String ? remove (Object ? key) => _fields.remove (key);
165+ List < String > ? remove (Object ? key) => _fields.remove (key);
160166}
161167
162168/// {@template uploaded_file}
0 commit comments