Skip to content

Commit b450e67

Browse files
authored
Merge pull request nahid#1 from azonedev/master
feat: Add support for multi-dimensional arrays on MultipartStreamHandler
2 parents ae2d1e3 + ea5f83f commit b450e67

File tree

1 file changed

+49
-31
lines changed

1 file changed

+49
-31
lines changed

src/Adapter/Guzzle/MultipartStreamHandler.php

+49-31
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public function __invoke(callable $handler)
1313
{
1414
return function(ServerRequestInterface $request, array $options) use ($handler){
1515
$contentType = $request->getHeader('Content-Type')[0] ?? 'plain/text';
16+
1617
if(!preg_match('#^multipart/form-data; boundary=(.*)#',$contentType,$matches)){
1718
return $handler($request,$options);
1819
}
@@ -27,7 +28,6 @@ public function __invoke(callable $handler)
2728

2829
$elements = [ ... $files, ... $fields];
2930

30-
3131
$multiStream = new MultipartStream($elements,$boundary);
3232
$request = $request->withBody($multiStream);
3333

@@ -38,57 +38,75 @@ public function __invoke(callable $handler)
3838

3939

4040
protected function files(array $files, $fileName = '', $elements = []) {
41+
4142
foreach($files as $name => $file){
42-
if(empty($fileName)){
43-
$fileName .= $name;
44-
} else {
45-
$fileName .= '[' . $name . ']';
46-
}
4743

4844
if (is_array($file)) {
49-
$elements = $this->files($file, $fileName, $elements);
50-
}
45+
foreach($file as $key => $value) {
46+
$fileName .= $name . '[' . $key . ']';
5147

52-
/** @var UploadedFile $file */
48+
$elements[] = $this->makeFileElements($fileName, $value);
49+
$fileName = '';
50+
continue;
5351

54-
if($file instanceof UploadedFileInterface) {
55-
$elements[] = [
56-
'name' => $fileName,
57-
'contents' => $file->getStream(),
58-
'filename' => $file->getClientFilename(),
59-
];
60-
61-
$fileName = '';
52+
}
53+
} else {
54+
$fileName .= $name;
55+
$elements[] = $this->makeFileElements($fileName, $file);
6256
}
6357

58+
59+
$fileName = '';
60+
6461
}
6562

6663
return $elements;
6764
}
6865

66+
protected function makeFileElements(string $fileName, UploadedFileInterface $file): array
67+
{
68+
return [
69+
'name' => $fileName,
70+
'contents' => $file->getStream(),
71+
'filename' => $file->getClientFilename(),
72+
'headers' => [
73+
'Content-Type' => 'image/jpg'
74+
]
75+
];
76+
}
77+
6978
protected function postFields(array $postFields, $fieldName = '', $elements = []) {
7079
foreach($postFields as $name => $postField){
71-
if(empty($fieldName)){
72-
$fieldName .= $name;
73-
} else {
74-
$fieldName .= '[' . $name . ']';
75-
}
76-
7780
if (is_array($postField)) {
78-
$elements = $this->postFields($postField, $fieldName, $elements);
81+
$elements = $this->makeArrayPostFields($postField, $name, $elements);
82+
}else {
83+
$elements[] = $this->makePostFieldsElement($name, $postField);
7984
}
85+
}
8086

81-
if(is_string($postField)) {
82-
$elements[] = [
83-
'name' => $fieldName,
84-
'contents' => $postField,
85-
];
87+
return $elements;
88+
}
8689

87-
$fieldName = '';
90+
protected function makeArrayPostFields(array $postFields, string $fieldName, array $elements): array
91+
{
92+
foreach ($postFields as $key => $value){
93+
$name = $fieldName . '[' . $key . ']';
94+
if(is_string($value)){
95+
$elements[] = $this->makePostFieldsElement($name, $value);
96+
}else{
97+
$elements = $this->makeArrayPostFields($value, $name, $elements);
8898
}
99+
$name = '';
89100
}
90-
91101
return $elements;
92102
}
93103

104+
protected function makePostFieldsElement(string $name, string $content): array
105+
{
106+
return [
107+
'name' => $name,
108+
'contents' => $content
109+
];
110+
}
111+
94112
}

0 commit comments

Comments
 (0)