Ad

October CMS Extend System/Models/File

- 1 answer

I trying to keep original file name when using System/Models/File, I got following code to extend this model:

    namespace System\Models;
class NewFile extends File { public function fromPost($uploadedFile) { if ($uploadedFile === null) { return; }

  $this->file_name = $uploadedFile->getClientOriginalName();
  $this->file_size = $uploadedFile->getClientSize();
  $this->content_type = $uploadedFile->getMimeType();
  $this->disk_name = $this->getDiskName();

  /*
   * getRealPath() can be empty for some environments (IIS)
   */
  $realPath = empty(trim($uploadedFile->getRealPath()))
      ? $uploadedFile->getPath() . DIRECTORY_SEPARATOR . $uploadedFile->getFileName()
      : $uploadedFile->getRealPath();

  //$this->putFile($realPath, $this->disk_name);
  $this->putFile($realPath, $this->file_name);

  return $this;

It works with file itself, it keeps original name but problem is link to attached file is still being generated. Broke my mind but cant get this work. Can anyone elaborate how to fix it?

Ad

Answer

Oh I see it seems its try to use disk_name to generate URL

so you did well for saving an image

//$this->putFile($realPath, $this->disk_name);
$this->putFile($realPath, $this->file_name);

but you just need to replace one line .. just undo your changes and make this one change

 $this->file_name = $uploadedFile->getClientOriginalName();
 $this->file_size = $uploadedFile->getClientSize();
 $this->content_type = $uploadedFile->getMimeType();
 // $this->disk_name = $this->getDiskName();  
 $this->disk_name = $this->file_name; 
 // use same file_name for disk ^ HERE

Link logic ( for referance only ) vendor\october\rain\src\Database\Attach\File.php and modules\system\models\File.php

/**
 * Returns the public address to access the file.
 */
public function getPath()
{
    return $this->getPublicPath() . $this->getPartitionDirectory() . $this->disk_name;
}

/**
* Define the public address for the storage path.
*/
public function getPublicPath()
{
    $uploadsPath = Config::get('cms.storage.uploads.path', '/storage/app/uploads');

    if ($this->isPublic()) {
        $uploadsPath .= '/public';
    }
    else {
        $uploadsPath .= '/protected';
    }

    return Url::asset($uploadsPath) . '/';
}

Just make disk_name also same as file_name so when file saved on disk it will use original name and when the link is generated it also use disk_name which is original file_name

now your link and file name are synced and will be same always.

if any doubt please comment.

Ad
source: stackoverflow.com
Ad