StefGuev
StefGuev

Reputation: 649

SilverStripe UploadField file auto renaming

I have made a form on the front end to upload some images. My idea is to automatically rename all files uploaded into unique id's.

I have looked at the SilverStripe API and I do not see anything about that. UploadField API

Is this possible?

Upvotes: 2

Views: 474

Answers (2)

StefGuev
StefGuev

Reputation: 649

Here is my solution bellow, in Silverstripe 3.X we must extend UploadField with another class. Then copy the ''saveTemporaryFile'' function into it.

Just before ''try'', just have to add :

$ext = array_reverse(explode('.',$tmpFile['name'])); // explode filename into array, reverse array, first array key will then be file extension
$tmpFile['name'] = hash_hmac('sha256', $tmpFile['name'], '12345') . '.' . $ext[0];

Results :

class RandomNameUploadField extends UploadField {


protected function saveTemporaryFile($tmpFile, &$error = null) {

    // Determine container object
    $error = null;
    $fileObject = null;

    if (empty($tmpFile)) {
        $error = _t('UploadField.FIELDNOTSET', 'File information not found');
        return null;
    }

    if($tmpFile['error']) {
        $error = $tmpFile['error'];
        return null;
    }

    // Search for relations that can hold the uploaded files, but don't fallback
    // to default if there is no automatic relation
    if ($relationClass = $this->getRelationAutosetClass(null)) {
        // Create new object explicitly. Otherwise rely on Upload::load to choose the class.
        $fileObject = Object::create($relationClass);
    }

    $ext = array_reverse(explode('.',$tmpFile['name'])); // explode filename into array, reverse array, first array key will then be file extension
    $tmpFile['name'] = hash_hmac('sha256', $tmpFile['name'], '12345') . '.' . $ext[0];

    // Get the uploaded file into a new file object.
    try {
        $this->upload->loadIntoFile($tmpFile, $fileObject, $this->getFolderName());
    } catch (Exception $e) {
        // we shouldn't get an error here, but just in case
        $error = $e->getMessage();
        return null;
    }

    // Check if upload field has an error
    if ($this->upload->isError()) {
        $error = implode(' ' . PHP_EOL, $this->upload->getErrors());
        return null;
    }

    // return file
    return $this->upload->getFile();
}



}

Thanks @3dgoo to give me a part of the solution!

Upvotes: 2

Jose Marques
Jose Marques

Reputation: 748

I don't now about a API but with some code I was able to do that.

You have two possibilities.

First using database.

Second using only code:

$directory = '/teste/www/fotos/';
$files = glob($directory . '*.jpg');

if ( $files !== false )
{
    $filecount = count( $files );
    $newid = $filecount+1;
    $new_name = "foto_".$newid;
    $target_file =  $directory."/".$new_name;
    move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file);

}
else
{
     $new_name = "foto_1";
     $target_file =  $directory."/".$new_name;
     move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file);
}

My example is for jpeg but you can look for hall types.

Upvotes: 0

Related Questions