This solution is mostly hack around thephpleague/flysystem-azure-blob-storage
and requires 3+ version.
Tested with Laravel 10, probably supported Laravel 8 & 9, additional tests needed.
Check your solutions carefully before release.
Needed to integrate with L5+ out of the box, and url method for Storage interface.
Install package
composer require ijin82/flysystem-azure
Open config/app.php and add this to providers section
Ijin82\Flysystem\Azure\AzureBlobServiceProvider::class,
Open config/filesystems.php and add this stuff to disks section
'my_azure_disk1' => [
'driver' => 'azure_blob',
'endpoint' => env('AZURE_BLOB_STORAGE_ENDPOINT'),
'container' => env('AZURE_BLOB_STORAGE_CONTAINER1'),
'blob_service_url' => env('AZURE_BLOB_SERVICE_URL'),
],
Open your .env and add variables for your disk
AZURE_BLOB_SERVICE_URL={your-blob-service-url}
AZURE_BLOB_STORAGE_ENDPOINT="DefaultEndpointsProtocol=https;AccountName={your-account-name};AccountKey={your-account-key};"
AZURE_BLOB_STORAGE_CONTAINER1={your-container-name}
- You can get AZURE_BLOB_SERVICE_URL variable from Properties section of your Storage account settings.
That is an url named PRIMARY BLOB SERVICE ENDPOINT or SECONDARY BLOB SERVICE ENDPOINT.
Same time that could be Azure CDN address (related to your endpoint) to use it as public address for files URL generation. - You can get AZURE_BLOB_STORAGE_ENDPOINT variable from Access keys section of your Storage account settings. That is named CONNECTION STRING
- AZURE_BLOB_STORAGE_CONTAINER1 is the name of your pre-created container, that you can add at Overview section of your Storage account settings.
REM Path related to container, you need file prefix only if you need subfolder inside container
# Upload example
Storage::disk('disk1')->put('file-folder/file1.png',
file_get_contents('/my/file/path/file1.png'),
[
'mimetype' => 'image/png',
]
);
# Get file URL example
$publicUrl = Storage::disk('disk1')->url('file-folder/file1.png');
# Check file exists example
$exists1 = Storage::disk('disk1')->exists('file-folder/file1.png');
# Get file contents example
$contents = Storage::disk('disk1')->get('file-folder/file1.png');
# Delete file example
Storage::disk('disk1')->delete('file-folder/file1.png');
# Delete directory example
# Warning, recursive folder deletion!
Storage::disk('disk1')->deleteDir('file-folder');
# Put uploaded file to storage example
# $file could be file path on disk (string) OR type of File|UploadedFile
Storage::disk('disk1')->putFileAs('file-folder', $file, 'file1.png');
public function someUploadFuncName(Request $request)
{
$file = $request->file('file_name_from_request');
// .. file name logic
// .. file folder logic
$file->storeAs($fileFolder, $fileName, [
'disk' => 'my_azure_disk1'
]);
// save file name logic
// to create file URL by name later
// maybe you want to save file name and folder separated
$fileNameToSave = $folderName . '/' . $diskFileName;
// .. save file name to DB or etc.
}
We got file name for selected disk (folder related if folder exists)
echo Storage::disk('my_azure_disk1')->url($fileName);
That is also working in blade templates like this
<a href="{{ Storage::disk('my_azure_disk1')->url($fileName) }}"
target="_blank">{{ $fileName }}</a>
public function someDeleteFuncName($id)
{
$file = SomeFileModel::findOrFail($id);
Storage::disk('my_azure_disk1')->delete($file->name);
$file->delete();
// go back or etc..
}
Sometimes you need to set up mime types manually (for CDN maybe) to get back correct mime type values. You can do that like this (couple types forced for example):
$fileConents = Storage::disk('public_or_another_local_disk')->get($file);
$forcedMimes = [
'js' => 'application/javascript',
'json' => 'application/json',
];
$fileExt = \File::extension($file);
if (array_key_exists($fileExt, $forcedMimes)) {
$fileMime = $forcedMimes[$fileExt];
} else {
$fileMime = mime_content_type(Storage::disk('public_or_another_local_disk')->path($file));
}
Storage::disk('my_custom_azure_disk')->put($fileName, $fileConents, [
'mimetype' => $fileMime,
]);
You can use wget to get response with headers including Content-Type
wget -S https://your-file-host.com/file-name.jpg
- Original repo is here
- How to use blob storage from PHP
- Feel free to send pull requests and issues.