Skip to content

Commit

Permalink
Guess the file mime type (if not provided) when uploading
Browse files Browse the repository at this point in the history
  • Loading branch information
mmetayer committed Oct 11, 2021
1 parent ca4a7c5 commit a635052
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 6 deletions.
29 changes: 23 additions & 6 deletions src/GoogleCloudStorage/GoogleCloudStorageAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
use League\Flysystem\UnableToSetVisibility;
use League\Flysystem\UnableToWriteFile;
use League\Flysystem\Visibility;
use League\MimeTypeDetection\FinfoMimeTypeDetector;
use League\MimeTypeDetection\MimeTypeDetector;
use Throwable;

class GoogleCloudStorageAdapter implements FilesystemAdapter
Expand All @@ -46,12 +48,23 @@ class GoogleCloudStorageAdapter implements FilesystemAdapter
*/
private $defaultVisibility;

public function __construct(Bucket $bucket, string $prefix = '', VisibilityHandler $visibilityHandler = null, string $defaultVisibility = Visibility::PRIVATE)
{
/**
* @var MimeTypeDetector
*/
private $mimeTypeDetector;

public function __construct(
Bucket $bucket,
string $prefix = '',
VisibilityHandler $visibilityHandler = null,
string $defaultVisibility = Visibility::PRIVATE,
MimeTypeDetector $mimeTypeDetector = null
) {
$this->bucket = $bucket;
$this->prefixer = new PathPrefixer($prefix);
$this->visibilityHandler = $visibilityHandler ?: new PortableVisibilityHandler();
$this->defaultVisibility = $defaultVisibility;
$this->mimeTypeDetector = $mimeTypeDetector ?: new FinfoMimeTypeDetector();
}

public function fileExists(string $path): bool
Expand All @@ -77,10 +90,7 @@ public function writeStream(string $path, $contents, Config $config): void
private function upload(string $path, $contents, Config $config): void
{
$prefixedPath = $this->prefixer->prefixPath($path);
$options = [
'name' => $prefixedPath,
'metadata' => $config->get('metadata', []),
];
$options = ['name' => $prefixedPath];

$visibility = $config->get(Config::OPTION_VISIBILITY, $this->defaultVisibility);
$predefinedAcl = $this->visibilityHandler->visibilityToPredefinedAcl($visibility);
Expand All @@ -89,6 +99,13 @@ private function upload(string $path, $contents, Config $config): void
$options['predefinedAcl'] = $predefinedAcl;
}

$metadata = $config->get('metadata', []);
$shouldDetermineMimetype = $contents !== '' && ! array_key_exists('contentType', $metadata);
if ($shouldDetermineMimetype && $mimeType = $this->mimeTypeDetector->detectMimeType($path, $contents)) {
$metadata['contentType'] = $mimeType;
}
$options['metadata'] = $metadata;

try {
$this->bucket->upload($contents, $options);
} catch (Throwable $exception) {
Expand Down
11 changes: 11 additions & 0 deletions src/GoogleCloudStorage/GoogleCloudStorageAdapterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,17 @@ public function writing_with_specific_metadata(): void
$this->assertEquals('text/plain+special', $mimeType);
}

/**
* @test
*/
public function guessing_the_mime_type_when_writing(): void
{
$adapter = $this->adapter();
$adapter->write('some/config.txt', '<?xml version="1.0" encoding="UTF-8"?><test/>', new Config());
$mimeType = $adapter->mimeType('some/config.txt')->mimeType();
$this->assertEquals('text/xml', $mimeType);
}

/**
* @test
*/
Expand Down

0 comments on commit a635052

Please sign in to comment.