# Artikelbilder speichern

**URL:** <https://forum.shopware.com/t/artikelbilder-speichern/64460>\
**Category:** Programmierung\
**Created:** [4. Februar 2020 um 12:24 UTC](https://forum.shopware.com/t/artikelbilder-speichern/64460 "2020-02-04T12:24:41Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![AlexGalax](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/alexgalax/32/9925_2.png) [@AlexGalax](https://forum.shopware.com/u/AlexGalax)\
**Post date:** [4. Februar 2020 um 12:24 UTC](https://forum.shopware.com/t/artikelbilder-speichern/64460/1 "2020-02-04T12:24:41Z")

</div>

Hallo!

Auf dem Server werden alle Artikelbilder per FTP hochgeladen. Jetzt möchte ich diese Bilder, den entsprechenden Artikeln zuordnen. Dazu muss ich ja über den `fileSaver` das Medium persisten und dann über die product repository den Artikel akualisieren.

```
  public function createImages(){
    $images = glob(PluginSettings::DIR_IMAGES.'/'.$this->product['id'].'/*.{jpg,JPG,jpeg,JPEG,png,PNG,gif,GIF}', GLOB_BRACE);
    foreach($images as $sourcePath){

      $mediaId = UuidMore::randomHex();
      $fileExtension = pathinfo($sourcePath, PATHINFO_EXTENSION);
      $fileSize = filesize($sourcePath);
      $mimeType = mime_content_type($sourcePath);
      $fileName = basename($sourcePath, '.'.$fileExtension);

      $mediaFile = new MediaFile($sourcePath, $mimeType, $fileExtension, $fileSize);

      try {
        $this->fileSaver->persistFileToMedia(
          $mediaFile,
          $this->product['name'].$fileName,
          $mediaId,
          Context::createDefaultContext()
        );
      } catch (DuplicatedMediaFileNameException $e) {
        $this->fileSaver->persistFileToMedia($mediaFile, $fileName . mb_substr(Uuid::randomHex(), 0, 5), $mediaId, Context::createDefaultContext());
      }
    }

```

Leider bekomme ich beim persistFileToMedia immer [diese Fehlermeldung](https://i.imgur.com/5eqNr1K.png). Was mache ich falsch?

---

<div class="post-metadata">

**Author:** ![AlexGalax](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/alexgalax/32/9925_2.png) [@AlexGalax](https://forum.shopware.com/u/AlexGalax)\
**Post date:** [5. Februar 2020 um 08:22 UTC](https://forum.shopware.com/t/artikelbilder-speichern/64460/2 "2020-02-05T08:22:51Z")

</div>

nach jeder menge trial and error habe ich es jetzt so gelöst:

```
      // get fileinfos
      $fileExtension = pathinfo($sourcePath, PATHINFO_EXTENSION);
      $fileSize = filesize($sourcePath);
      $mimeType = mime_content_type($sourcePath);
      $fileName = basename($sourcePath, '.'.$fileExtension);

      // get blob
      $imagick = new \Imagick($sourcePath);
      $blob = $imagick->getImagesBlob();

      $uploadedFile = $this->fileFetcher->fetchBlob($blob, $fileExtension, $mimeType);

      $mediaId = $this->mediaService->saveFile(
        $blob,
        $fileExtension,
        $mimeType,
        $fileName,
        Context::createDefaultContext(),
        'product',
        false,
        false // not private!
      );

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![mowlwurf](https://avatars.discourse-cdn.com/v4/letter/m/77aa72/32.png) [@mowlwurf](https://forum.shopware.com/u/mowlwurf)\
**Post date:** [6. Februar 2020 um 13:45 UTC](https://forum.shopware.com/t/artikelbilder-speichern/64460/3 "2020-02-06T13:45:22Z")

</div>

Hi Alex,

hatte ein ähnliches Vorhaben mit lokalen Files. Habe mir dafür einen eigenen Service gebastelt der dies wie folgt löst

```
/**
     * MediaHelper constructor.
     * @param MediaService $mediaService
     * @param FileFetcher $fileFetcher
     * @param FileSaver $fileSaver
     */
    public function __construct(MediaService $mediaService, FileFetcher $fileFetcher, FileSaver $fileSaver)
    {
        $this->mediaService = $mediaService;
        $this->fileFetcher = $fileFetcher;
        $this->fileSaver = $fileSaver;
    }

    /**
     * @param string $file
     * @param null|string $filename
     * @param string $folder
     * @param bool $private
     * @return string
     * @throws \Shopware\Core\Content\Media\Exception\DuplicatedMediaFileNameException
     * @throws \Shopware\Core\Content\Media\Exception\EmptyMediaFilenameException
     * @throws \Shopware\Core\Content\Media\Exception\IllegalFileNameException
     * @throws \Shopware\Core\Content\Media\Exception\MediaNotFoundException
     */
    public function saveMediaFromFile($file, $filename = null, $folder = '', $private = false): string
    {
        $fileInfo = $this->getFileInfo($file);
        $mediaFile = new MediaFile($file, $fileInfo['mimeType'], $fileInfo['extension'], $fileInfo['fileSize']);

        return $this->saveMedia($mediaFile, $filename ?? $fileInfo['filename'], $folder, $private);
    }

/**
     * @param MediaFile $mediaFile
     * @param string $filename
     * @param string $folder
     * @param bool $private
     * @return string
     * @throws \Shopware\Core\Content\Media\Exception\DuplicatedMediaFileNameException
     * @throws \Shopware\Core\Content\Media\Exception\EmptyMediaFilenameException
     * @throws \Shopware\Core\Content\Media\Exception\IllegalFileNameException
     * @throws \Shopware\Core\Content\Media\Exception\MediaNotFoundException
     */
    private function saveMedia(MediaFile $mediaFile, $filename, $folder, $private): string
    {
        $context = Context::createDefaultContext();
        $mediaId = $this->mediaService->createMediaInFolder($folder, $context, $private);
        $this->fileSaver->persistFileToMedia($mediaFile, $filename, $mediaId, $context);

        return $mediaId;
    }

    /**
     * @param $file
     * @return array
     */
    private function getFileInfo($file): array
    {
        $fileArray = explode('/', $file);
        $fileName = array_pop($fileArray);
        $fileNameArray = explode('.', $fileName);
        $extension = array_pop($fileNameArray);
        $fileName = implode('.', $fileNameArray);

        return [
            'extension' => $extension,
            'filename' => $fileName,
            'mimeType' => mime_content_type($file),
            'fileSize' => filesize($file)
        ];
    }

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![RobC](https://avatars.discourse-cdn.com/v4/letter/r/e9a140/32.png) [@RobC](https://forum.shopware.com/u/RobC)\
**Post date:** [8. März 2021 um 15:40 UTC](https://forum.shopware.com/t/artikelbilder-speichern/64460/4 "2021-03-08T15:40:48Z")

</div>

Hi Mowlwurf.

Ich muss diesen Post mal ein wenig hijacken.

> [@mowlwurf](#):
>
> `createMediaInFolder($folder, $context, $private);`

Ich möchte meine Dateien gerne in einen bestimmten Ordner ablegen, aber die Dateien landen (wenn nicht gerade $folder = „products“) stets im Media-Root. Weder die Übergabe des Verzeichnisnamens noch die der Folder-ID bringen mich weiter, was mich zur Vermutung bringt, dass man bei Angabe eines custom Folders noch irgendetwas mehr veranstalten muss… korrekt?  
Wie geht man da am Besten vor?

---

<div class="post-metadata">

**Author:** ![mowlwurf](https://avatars.discourse-cdn.com/v4/letter/m/77aa72/32.png) [@mowlwurf](https://forum.shopware.com/u/mowlwurf)\
**Post date:** [8. März 2021 um 20:06 UTC](https://forum.shopware.com/t/artikelbilder-speichern/64460/5 "2021-03-08T20:06:36Z")

</div>

Hi Rob,

die Funktion findet leider nur Verzeichnisse welche als Standardspeicherort für bestimmte Objekte definiert wurden. Entweder über den Admin, oder direkt in der Datenbank, Tabelle media\_default\_folder. „Normale“ Verzeichnisse werden leider nicht durchsucht und entsprechend zugewiesen, daher landen die Bilder dann im Hauptverzeichnis.
