title: Laravel Spatie media library getFullUrl method not working inside the loop
body: <p>I am developing API in laravel. When I try to fetch an uploaded image url inside a loop that gives me this error,</p>
  <p><strong>Spatie\MediaLibrary\Exceptions\UrlCannotBeDetermined: Storage path myAppPath\storage\app is not part of public path myAppPath\public in file myAppPath\vendor\spatie\laravel-medialibrary\src\Exceptions\UrlCannotBeDetermined.php on line 11</strong></p>
  <p>But when I try to get url directly it works.
  like this ==&gt;</p>
  <pre><code>$log = Log::find($id)-&gt;getMedia('images');
  return $log[0]-&gt;getFullUrl();
  </code></pre>
  <p>this is my code. below code is not working</p>
  <pre><code>$logs = Log::where(function ($query) {
  $query-&gt;where('owner', '=', Auth::user()-&gt;id)
  -&gt;orWhere('owner', '=', Auth::user()-&gt;partner-&gt;id);
  })
  -&gt;orderBy('date', 'desc')
  -&gt;get();
  
      $resArr= array();
  
      for($i=0;$i&lt;count($logs);$i++){
          $mediaArray = $logs[$i]-&gt;getMedia('images');
  
          $m =array();
  
          for ($j=0;$j&lt;count($mediaArray);$j++){
              $med = array(
                  'id'=&gt;$mediaArray[$j]-&gt;id,
                  'model_id'=&gt;$mediaArray[$j]-&gt;model_id,
                  'file_name'=&gt;$mediaArray[$j]-&gt;file_name,
                  'url'=&gt;$mediaArray[$j]-&gt;getFullUrl(), // here not working
  
              );
              array_push($m,$med);
          }
  
  
  
          $a = array(
              'id'=&gt;$logs[$i]-&gt;id,
              'title'=&gt;$logs[$i]-&gt;title,
              'owner'=&gt;$logs[$i]-&gt;owner,
              'body'=&gt;$logs[$i]-&gt;body,
              'date'=&gt;$logs[$i]-&gt;date,
              'mood'=&gt;$logs[$i]-&gt;mood,
              'created_at'=&gt;$logs[$i]-&gt;created_at,
              'partner_log_id'=&gt;$logs[$i]-&gt;partner_log_id,
              'media'=&gt;$m,
              'partner_log'=&gt;$logs[$i]-&gt;partnerLog,
  
          );
  
          array_push($resArr,$a);
      }
      return \response()-&gt;json(['status'=&gt;'success','data'=&gt;$resArr]);
  </code></pre>
  <p>This is my medialibrary.php file.</p>
  <pre><code>&lt;?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' =&gt; 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' =&gt; 1024 * 1024 * 10,
  
      /*
       * This queue will be used to generate derived and responsive images.
       * Leave empty to use the default queue.
       */
      'queue_name' =&gt; '',
  
      /*
       * The fully qualified class name of the media model.
       */
      'media_model' =&gt; Spatie\MediaLibrary\Models\Media::class,
  
      's3' =&gt; [
          /*
           * The domain that should be prepended when generating urls.
           */
          'domain' =&gt; 'https://'.env('AWS_BUCKET').'.s3.amazonaws.com',
      ],
  
      'remote' =&gt; [
          /*
           * 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' =&gt; [
              'CacheControl' =&gt; 'max-age=604800',
          ],
      ],
  
      'responsive_images' =&gt; [
  
          /*
           * 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' =&gt; Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::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' =&gt; 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' =&gt; Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::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' =&gt; 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' =&gt; false,
  
      /*
       * The class that contains the strategy for determining a media file's path.
       */
      'path_generator' =&gt; 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' =&gt; [
          Spatie\ImageOptimizer\Optimizers\Jpegoptim::class =&gt; [
              '--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
          ],
          Spatie\ImageOptimizer\Optimizers\Pngquant::class =&gt; [
              '--force', // required parameter for this package
          ],
          Spatie\ImageOptimizer\Optimizers\Optipng::class =&gt; [
              '-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
          ],
          Spatie\ImageOptimizer\Optimizers\Svgo::class =&gt; [
              '--disable=cleanupIDs', // disabling because it is known to cause troubles
          ],
          Spatie\ImageOptimizer\Optimizers\Gifsicle::class =&gt; [
              '-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' =&gt; [
          Spatie\MediaLibrary\ImageGenerators\FileTypes\Image::class,
          Spatie\MediaLibrary\ImageGenerators\FileTypes\Webp::class,
          Spatie\MediaLibrary\ImageGenerators\FileTypes\Pdf::class,
          Spatie\MediaLibrary\ImageGenerators\FileTypes\Svg::class,
          Spatie\MediaLibrary\ImageGenerators\FileTypes\Video::class,
      ],
  
      /*
       * The engine that should perform the image conversions.
       * Should be either `gd` or `imagick`.
       */
      'image_driver' =&gt; 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' =&gt; env('FFMPEG_PATH', '/usr/bin/ffmpeg'),
      'ffprobe_path' =&gt; 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' =&gt; 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' =&gt; [
          'perform_conversions' =&gt; Spatie\MediaLibrary\Jobs\PerformConversions::class,
          'generate_responsive_images' =&gt; Spatie\MediaLibrary\Jobs\GenerateResponsiveImages::class,
      ],
  ];
  </code></pre>
  <p>This is filesystems.php file.</p>
  <pre><code>&lt;?php
  
  return [
  
      /*
      |--------------------------------------------------------------------------
      | Default Filesystem Disk
      |--------------------------------------------------------------------------
      |
      | Here you may specify the default filesystem disk that should be used
      | by the framework. The &quot;local&quot; disk, as well as a variety of cloud
      | based disks are available to your application. Just store away!
      |
      */
  
      'default' =&gt; 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 &quot;cloud&quot; driver here. This driver
      | will be bound as the Cloud disk implementation in the container.
      |
      */
  
      'cloud' =&gt; env('FILESYSTEM_CLOUD', 's3'),
  
      /*
      |--------------------------------------------------------------------------
      | Filesystem Disks
      |--------------------------------------------------------------------------
      |
      | Here you may configure as many filesystem &quot;disks&quot; 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: &quot;local&quot;, &quot;ftp&quot;, &quot;sftp&quot;, &quot;s3&quot;
      |
      */
  
      'disks' =&gt; [
  
          'local' =&gt; [
              'driver' =&gt; 'local',
              'root' =&gt; storage_path('app'),
          ],
  
          'public' =&gt; [
              'driver' =&gt; 'local',
              'root' =&gt; storage_path('app/public'),
              'url' =&gt; env('APP_URL').'/storage',
              'visibility' =&gt; 'public',
          ],
  
          's3' =&gt; [
              'driver' =&gt; 's3',
              'key' =&gt; env('AWS_ACCESS_KEY_ID'),
              'secret' =&gt; env('AWS_SECRET_ACCESS_KEY'),
              'region' =&gt; env('AWS_DEFAULT_REGION'),
              'bucket' =&gt; env('AWS_BUCKET'),
              'url' =&gt; 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' =&gt; [
          public_path('storage') =&gt; storage_path('app/public'),
      ],
  
  ];
  </code></pre>
  <p>Hope this helps.</p>
  <p>Any suggestion, please????</p>