#laravel #laravel-medialibrary
#laravel #laravel-medialibrary
Вопрос:
Я разрабатываю API в laravel. Когда я пытаюсь получить URL-адрес загруженного изображения внутри цикла, который выдает мне эту ошибку,
SpatieMediaLibraryExceptionsurlcannotbedetimed: путь к хранилищу myAppPathstorage app не является частью общедоступного пути myAppPathpublic в файле myAppPathvendorspatielaravel-medialibrarysrcExceptionsUrlCannotBeDetermined.php в строке 11
Но когда я пытаюсь получить url напрямую, он работает. вот так ==>
$log = Log::find($id)->getMedia('images');
return $log[0]->getFullUrl();
это мой код. приведенный ниже код не работает
$logs = Log::where(function ($query) {
$query->where('owner', '=', Auth::user()->id)
->orWhere('owner', '=', Auth::user()->partner->id);
})
->orderBy('date', 'desc')
->get();
$resArr= array();
for($i=0;$i<count($logs);$i ){
$mediaArray = $logs[$i]->getMedia('images');
$m =array();
for ($j=0;$j<count($mediaArray);$j ){
$med = array(
'id'=>$mediaArray[$j]->id,
'model_id'=>$mediaArray[$j]->model_id,
'file_name'=>$mediaArray[$j]->file_name,
'url'=>$mediaArray[$j]->getFullUrl(), // here not working
);
array_push($m,$med);
}
$a = array(
'id'=>$logs[$i]->id,
'title'=>$logs[$i]->title,
'owner'=>$logs[$i]->owner,
'body'=>$logs[$i]->body,
'date'=>$logs[$i]->date,
'mood'=>$logs[$i]->mood,
'created_at'=>$logs[$i]->created_at,
'partner_log_id'=>$logs[$i]->partner_log_id,
'media'=>$m,
'partner_log'=>$logs[$i]->partnerLog,
);
array_push($resArr,$a);
}
return response()->json(['status'=>'success','data'=>$resArr]);
Это мой medialibrary.php досье.
<?php
return [
/*
* The disk on which to store added files and derived images by default. Choose
* one or more of the disks you've configured in config/filesystems.php.
*/
'disk_name' => env('MEDIA_DISK', 'public'),
/*
* The maximum file size of an item in bytes.
* Adding a larger file will result in an exception.
*/
'max_file_size' => 1024 * 1024 * 10,
/*
* This queue will be used to generate derived and responsive images.
* Leave empty to use the default queue.
*/
'queue_name' => '',
/*
* The fully qualified class name of the media model.
*/
'media_model' => SpatieMediaLibraryModelsMedia::class,
's3' => [
/*
* The domain that should be prepended when generating urls.
*/
'domain' => 'https://'.env('AWS_BUCKET').'.s3.amazonaws.com',
],
'remote' => [
/*
* Any extra headers that should be included when uploading media to
* a remote disk. Even though supported headers may vary between
* different drivers, a sensible default has been provided.
*
* Supported by S3: CacheControl, Expires, StorageClass,
* ServerSideEncryption, Metadata, ACL, ContentEncoding
*/
'extra_headers' => [
'CacheControl' => 'max-age=604800',
],
],
'responsive_images' => [
/*
* This class is responsible for calculating the target widths of the responsive
* images. By default we optimize for filesize and create variations that each are 20%
* smaller than the previous one. More info in the documentation.
*
* https://docs.spatie.be/laravel-medialibrary/v7/advanced-usage/generating-responsive-images
*/
'width_calculator' => SpatieMediaLibraryResponsiveImagesWidthCalculatorFileSizeOptimizedWidthCalculator::class,
/*
* By default rendering media to a responsive image will add some javascript and a tiny placeholder.
* This ensures that the browser can already determine the correct layout.
*/
'use_tiny_placeholders' => true,
/*
* This class will generate the tiny placeholder used for progressive image loading. By default
* the medialibrary will use a tiny blurred jpg image.
*/
'tiny_placeholder_generator' => SpatieMediaLibraryResponsiveImagesTinyPlaceholderGeneratorBlurred::class,
],
/*
* When urls to files get generated, this class will be called. Leave empty
* if your files are stored locally above the site root or on s3.
*/
'url_generator' => null,
/*
* Whether to activate versioning when urls to files get generated.
* When activated, this attaches a ?v=xx query string to the URL.
*/
'version_urls' => false,
/*
* The class that contains the strategy for determining a media file's path.
*/
'path_generator' => null,
/*
* Medialibrary will try to optimize all converted images by removing
* metadata and applying a little bit of compression. These are
* the optimizers that will be used by default.
*/
'image_optimizers' => [
SpatieImageOptimizerOptimizersJpegoptim::class => [
'--strip-all', // this strips out all text information such as comments and EXIF data
'--all-progressive', // this will make sure the resulting image is a progressive one
],
SpatieImageOptimizerOptimizersPngquant::class => [
'--force', // required parameter for this package
],
SpatieImageOptimizerOptimizersOptipng::class => [
'-i0', // this will result in a non-interlaced, progressive scanned image
'-o2', // this set the optimization level to two (multiple IDAT compression trials)
'-quiet', // required parameter for this package
],
SpatieImageOptimizerOptimizersSvgo::class => [
'--disable=cleanupIDs', // disabling because it is known to cause troubles
],
SpatieImageOptimizerOptimizersGifsicle::class => [
'-b', // required parameter for this package
'-O3', // this produces the slowest but best results
],
],
/*
* These generators will be used to create an image of media files.
*/
'image_generators' => [
SpatieMediaLibraryImageGeneratorsFileTypesImage::class,
SpatieMediaLibraryImageGeneratorsFileTypesWebp::class,
SpatieMediaLibraryImageGeneratorsFileTypesPdf::class,
SpatieMediaLibraryImageGeneratorsFileTypesSvg::class,
SpatieMediaLibraryImageGeneratorsFileTypesVideo::class,
],
/*
* The engine that should perform the image conversions.
* Should be either `gd` or `imagick`.
*/
'image_driver' => env('IMAGE_DRIVER', 'gd'),
/*
* FFMPEG amp; FFProbe binaries paths, only used if you try to generate video
* thumbnails and have installed the php-ffmpeg/php-ffmpeg composer
* dependency.
*/
'ffmpeg_path' => env('FFMPEG_PATH', '/usr/bin/ffmpeg'),
'ffprobe_path' => env('FFPROBE_PATH', '/usr/bin/ffprobe'),
/*
* The path where to store temporary files while performing image conversions.
* If set to null, storage_path('medialibrary/temp') will be used.
*/
'temporary_directory_path' => null,
/*
* Here you can override the class names of the jobs used by this package. Make sure
* your custom jobs extend the ones provided by the package.
*/
'jobs' => [
'perform_conversions' => SpatieMediaLibraryJobsPerformConversions::class,
'generate_responsive_images' => SpatieMediaLibraryJobsGenerateResponsiveImages::class,
],
];
Это filesystems.php досье.
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Filesystem Disk
|--------------------------------------------------------------------------
|
| Here you may specify the default filesystem disk that should be used
| by the framework. The "local" disk, as well as a variety of cloud
| based disks are available to your application. Just store away!
|
*/
'default' => env('FILESYSTEM_DRIVER', 'local'),
/*
|--------------------------------------------------------------------------
| Default Cloud Filesystem Disk
|--------------------------------------------------------------------------
|
| Many applications store files both locally and in the cloud. For this
| reason, you may specify a default "cloud" driver here. This driver
| will be bound as the Cloud disk implementation in the container.
|
*/
'cloud' => env('FILESYSTEM_CLOUD', 's3'),
/*
|--------------------------------------------------------------------------
| Filesystem Disks
|--------------------------------------------------------------------------
|
| Here you may configure as many filesystem "disks" as you wish, and you
| may even configure multiple disks of the same driver. Defaults have
| been setup for each driver as an example of the required options.
|
| Supported Drivers: "local", "ftp", "sftp", "s3"
|
*/
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
],
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
],
],
/*
|--------------------------------------------------------------------------
| Symbolic Links
|--------------------------------------------------------------------------
|
| Here you may configure the symbolic links that will be created when the
| `storage:link` Artisan command is executed. The array keys should be
| the locations of the links and the values should be their targets.
|
*/
'links' => [
public_path('storage') => storage_path('app/public'),
],
];
Надеюсь, это поможет.
Любое предложение, пожалуйста????
Комментарии:
1. Что у вас есть в
configmedialibrary.php
ключеdisk_name
. Кроме того, также опубликуйте соответствующие сведения о диске изconfigfilesystems.php
2. @ShreyanshPanchal Я снова обновил вопрос с помощью этих двух файлов, пожалуйста, взгляните. Спасибо
3. Вы
php artisan storage:link
успешно запустились?4.
php artisan storage:link
исправлено ли для меня