Skip to content

Commit b7de070

Browse files
committed
upload images to nova
1 parent add04c2 commit b7de070

2 files changed

Lines changed: 66 additions & 15 deletions

File tree

app/Nova/Actions/BulkUploadMediaFiles.php

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use App\MediaUpload;
66
use Illuminate\Bus\Queueable;
7+
use Illuminate\Http\UploadedFile;
78
use Illuminate\Queue\InteractsWithQueue;
89
use Illuminate\Queue\SerializesModels;
910
use Illuminate\Support\Collection;
@@ -33,15 +34,11 @@ class BulkUploadMediaFiles extends Action
3334
*/
3435
public function handle(ActionFields $fields, Collection $models)
3536
{
36-
$uploadedFiles = $fields->files ?? request()->file('files');
37-
if (!$uploadedFiles) {
37+
$uploadedFiles = $this->collectUploadedFiles($fields);
38+
if (empty($uploadedFiles)) {
3839
return Action::danger('Please select one or more files.');
3940
}
4041

41-
if (!is_array($uploadedFiles)) {
42-
$uploadedFiles = [$uploadedFiles];
43-
}
44-
4542
$allowedExtensions = [
4643
'jpg', 'jpeg', 'png', 'gif', 'webp', 'svg',
4744
'pdf', 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', 'txt',
@@ -100,6 +97,7 @@ public function fields(NovaRequest $request): array
10097
File::make('Files', 'files')
10198
->withMeta([
10299
'extraAttributes' => [
100+
'name' => 'files[]',
103101
'multiple' => true,
104102
'accept' => '.jpg,.jpeg,.png,.gif,.webp,.svg,.pdf,.doc,.docx,.ppt,.pptx,.xls,.xlsx,.txt',
105103
],
@@ -109,6 +107,49 @@ public function fields(NovaRequest $request): array
109107
];
110108
}
111109

110+
/**
111+
* Collect uploaded files from Nova action fields + raw request payload.
112+
*
113+
* @return UploadedFile[]
114+
*/
115+
protected function collectUploadedFiles(ActionFields $fields): array
116+
{
117+
$candidates = [];
118+
119+
if (isset($fields->files)) {
120+
$candidates[] = $fields->files;
121+
}
122+
123+
$requestFiles = request()->allFiles();
124+
if (!empty($requestFiles)) {
125+
$candidates[] = $requestFiles;
126+
}
127+
128+
$flatten = function ($value) use (&$flatten): array {
129+
if ($value instanceof UploadedFile) {
130+
return [$value];
131+
}
132+
133+
if (!is_array($value)) {
134+
return [];
135+
}
136+
137+
$result = [];
138+
foreach ($value as $item) {
139+
$result = array_merge($result, $flatten($item));
140+
}
141+
142+
return $result;
143+
};
144+
145+
$files = [];
146+
foreach ($candidates as $candidate) {
147+
$files = array_merge($files, $flatten($candidate));
148+
}
149+
150+
return $files;
151+
}
152+
112153
/**
113154
* Indicate that this action can be run without any models.
114155
*/

app/Nova/MediaUpload.php

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,20 +55,16 @@ public function fields(Request $request): array
5555
->help('Uploads directly to S3 disk "resources" under folder "nova/uploads".'),
5656

5757
Text::make('URL', function () {
58-
if (empty($this->resolved_url)) {
59-
return '-';
60-
}
61-
62-
$url = $this->resolved_url;
63-
64-
return '<a href="' . e($url) . '" target="_blank" rel="noopener noreferrer">' . e($url) . '</a>';
58+
return $this->renderUrlWithCopy($this->resolved_url);
6559
})
6660
->asHtml()
6761
->onlyOnDetail(),
6862

6963
Text::make('URL', function () {
70-
return $this->resolved_url ?: '-';
71-
})->onlyOnIndex(),
64+
return $this->renderUrlWithCopy($this->resolved_url);
65+
})
66+
->asHtml()
67+
->onlyOnIndex(),
7268
];
7369
}
7470

@@ -83,4 +79,18 @@ public function actions(Request $request): array
8379
new BulkUploadMediaFiles,
8480
];
8581
}
82+
83+
protected function renderUrlWithCopy(?string $url): string
84+
{
85+
if (empty($url)) {
86+
return '-';
87+
}
88+
89+
$escapedUrl = e($url);
90+
$jsonUrl = json_encode($url, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP);
91+
$copyScript = "navigator.clipboard.writeText({$jsonUrl}).then(function(){alert('URL copied to clipboard');}).catch(function(){window.prompt('Copy URL:', {$jsonUrl});}); return false;";
92+
93+
return '<a href="' . $escapedUrl . '" target="_blank" rel="noopener noreferrer">' . $escapedUrl . '</a>'
94+
. ' <button type="button" class="btn btn-default btn-xs" onclick="' . e($copyScript) . '">Copy URL</button>';
95+
}
8696
}

0 commit comments

Comments
 (0)