Skip to content

Commit c3828e7

Browse files
authored
Added callback to manipulate FileAdder when performing a copy (#3658)
* New 'getDownloadFilename' method for extensibility Added Symfony HeaderUtils to create content disposition * Refactored how download file name is determined * Added closure to allow direct customisation of FileAdder on copy * Fix styling --------- Co-authored-by: chrispage1 <[email protected]>
1 parent 038c1ba commit c3828e7

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

src/MediaCollections/Models/Media.php

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Spatie\MediaLibrary\MediaCollections\Models;
44

5+
use Closure;
56
use DateTimeInterface;
67
use Illuminate\Contracts\Mail\Attachable;
78
use Illuminate\Contracts\Support\Htmlable;
@@ -20,6 +21,7 @@
2021
use Spatie\MediaLibrary\Conversions\ConversionCollection;
2122
use Spatie\MediaLibrary\Conversions\ImageGenerators\ImageGeneratorFactory;
2223
use Spatie\MediaLibrary\HasMedia;
24+
use Spatie\MediaLibrary\MediaCollections\FileAdder;
2325
use Spatie\MediaLibrary\MediaCollections\Filesystem;
2426
use Spatie\MediaLibrary\MediaCollections\HtmlableMedia;
2527
use Spatie\MediaLibrary\MediaCollections\Models\Collections\MediaCollection;
@@ -393,9 +395,16 @@ public function move(HasMedia $model, $collectionName = 'default', string $diskN
393395
return $newMedia;
394396
}
395397

396-
/** @param string $collectionName */
397-
public function copy(HasMedia $model, $collectionName = 'default', string $diskName = '', string $fileName = ''): self
398-
{
398+
/**
399+
* @param null|Closure(FileAdder): FileAdder $fileAdderCallback
400+
*/
401+
public function copy(
402+
HasMedia $model,
403+
string $collectionName = 'default',
404+
string $diskName = '',
405+
string $fileName = '',
406+
?Closure $fileAdderCallback = null
407+
): self {
399408
$temporaryDirectory = TemporaryDirectory::create();
400409

401410
$temporaryFile = $temporaryDirectory->path('/').DIRECTORY_SEPARATOR.$this->file_name;
@@ -411,11 +420,16 @@ public function copy(HasMedia $model, $collectionName = 'default', string $diskN
411420
->setOrder($this->order_column)
412421
->withManipulations($this->manipulations)
413422
->withCustomProperties($this->custom_properties);
423+
414424
if ($fileName !== '') {
415425
$fileAdder->usingFileName($fileName);
416426
}
417-
$newMedia = $fileAdder
418-
->toMediaCollection($collectionName, $diskName);
427+
428+
if ($fileAdderCallback instanceof Closure) {
429+
$fileAdder = $fileAdderCallback($fileAdder);
430+
}
431+
432+
$newMedia = $fileAdder->toMediaCollection($collectionName, $diskName);
419433

420434
$temporaryDirectory->delete();
421435

tests/Feature/Media/CopyTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?php
22

3+
use Spatie\MediaLibrary\MediaCollections\FileAdder;
34
use Spatie\MediaLibrary\Tests\TestSupport\TestModels\TestModel;
45

56
it('can copy media from one model to another', function () {
@@ -99,6 +100,30 @@
99100
expect('custom-property-value')->toEqual($movedMedia->getCustomProperty('custom-property-name'));
100101
});
101102

103+
it('can handle file adder callback', function () {
104+
/** @var TestModel $model */
105+
$model = TestModel::create(['name' => 'test']);
106+
107+
/** @var \Spatie\MediaLibrary\MediaCollections\Models\Media $media */
108+
$media = $model
109+
->addMedia($this->getTestJpg())
110+
->usingName('custom-name')
111+
->withCustomProperties(['custom-property-name' => 'custom-property-value'])
112+
->toMediaCollection();
113+
114+
$this->assertFileExists($this->getMediaDirectory($media->id.'/test.jpg'));
115+
116+
$anotherModel = TestModel::create(['name' => 'another-test']);
117+
118+
$movedMedia = $media->copy($anotherModel, 'images', fileAdderCallback: function (FileAdder $fileAdder): FileAdder {
119+
return $fileAdder->usingFileName('new-filename.jpg');
120+
});
121+
122+
$movedMedia->refresh();
123+
124+
expect($movedMedia->file_name)->toBe('new-filename.jpg');
125+
});
126+
102127
it('can copy file with accent', function () {
103128
if (! file_exists(storage_path('media-library/temp'))) {
104129
mkdir(storage_path('media-library/temp'), 0777, true);

0 commit comments

Comments
 (0)