Replacing Files

A common task is to replace one existing image with a new image.

Assuming we have a model table called DocumentsTable that is associated by ahasOne association with the ImageStorageTable table. The associations alias is Images. Your form should look like this:

echo $this->Form->file('image.file');
echo $this->Form->error('image.file');

if (isset($document) && !empty($document['Image']['id'])) {
    echo $this->Image->display($document->image);
    echo $this->Form->input('image.old_file_id', array(
        'type' => 'hidden',
        'value' => $document->id,
    ));
}

The the trick here is the old_file_id. The FileStorageTable table, which ImageStorageTable extends, is checking for that field by calling FileStorageTable::deleteOldFileOnSave() in FileStorageTable::afterSave().

So all you have to do to replace an image is to pass the old_file_id along with your new file data.

Just make sure that nobody can tamper your forms with unwanted data! If somebody can do that they can pass any id to delete any file! It is recommended to use the Security component of the framework to avoid that.