Albin N
Albin N

Reputation: 1401

jQuery File Upload by bluimp, how to replace instead of renaming

First of all the jQuery plugin can be found here:

https://github.com/blueimp/jQuery-File-Upload

I'm using the PHP-version of the script and I'm trying to replace images that has the same name instead of renaming them.

I think I've found the functions that do the renaming, but the edits I tried do not work.

  protected function upcount_name_callback($matches) {
        $index = isset($matches[1]) ? intval($matches[1]) + 1 : 1;
        $ext = isset($matches[2]) ? $matches[2] : '';
        return ' ('.$index.')'.$ext;
    }

    protected function upcount_name($name) {
        return preg_replace_callback(
            '/(?:(?: \(([\d]+)\))?(\.[^.]+))?$/',
            array($this, 'upcount_name_callback'),
            $name,
            1
        );
    }

Any suggestions? I've searched for this all over the place but to no avail.

Link to the php class that does the upload: https://github.com/blueimp/jQuery-File-Upload/blob/master/server/php/upload.class.php

Any suggestions?

Edit:

I've tried to just return null on these functions, but that just hangs the script, probably because it doesn't know what to do if the filename is the same.

Upvotes: 6

Views: 4508

Answers (3)

Cyril Jacquart
Cyril Jacquart

Reputation: 2762

you can also use overwrite as an option like this:

$options = array(
  'overwrite' => $overwrite
);
$upload_handler = new UploadHandler($options);

in UploadHandler.php : add the default parameter

    function __construct($options = null,...){
            ...
            'overwrite' => false,
            ...
    }

then replace get_file_name() function by

    protected function get_file_name($file_path, $name, $size, $type, $error,
            $index, $content_range) {
        $name = $this->trim_file_name($file_path, $name, $size, $type, $error,
            $index, $content_range);
        if($this->options['overwrite'])
            return $name;
        else
            return $this->get_unique_filename(
                $file_path,
                $this->fix_file_extension($file_path, $name, $size, $type, $error,
                    $index, $content_range),
                $size,
                $type,
                $error,
                $index,
                $content_range
            );
    }

regards

Upvotes: 0

Primoz Rome
Primoz Rome

Reputation: 11031

You can alter their PHP server side script to have files overwritten instead of creating a new unique filename. Just alter upload handler class function get_file_name:

Original function:

 protected function get_file_name($file_path, $name, $size, $type, $error,
        $index, $content_range) {
    $name = $this->trim_file_name($file_path, $name, $size, $type, $error,
        $index, $content_range);
    return $this->get_unique_filename(
        $file_path,
        $this->fix_file_extension($file_path, $name, $size, $type, $error,
            $index, $content_range),
        $size,
        $type,
        $error,
        $index,
        $content_range
    );
}

alter it to this:

protected function get_file_name($file_path, $name, $size, $type, $error,
            $index, $content_range) {
        $name = $this->trim_file_name($file_path, $name, $size, $type, $error,
            $index, $content_range);
        return $name;
    }

This way existing file will get overwritten if the uploaded file-name is same as the existing file on your server.

Upvotes: 9

Vladimir Salguero
Vladimir Salguero

Reputation: 5947

Use this custom function in file index.php require UploadHandler.php

protected function trim_file_name($file_path, $name, $size, $type, $error,
            $index, $content_range) {

    // Remove path information and dots around the filename, to prevent uploading
    // into different directories or replacing hidden system files.
    // Also remove control characters and spaces (\x00..\x20) around the filename:
    $name = trim(basename(stripslashes(unique_custom_file_name)), ".\x00..\x20");
    // Use a timestamp for empty filenames:
    if (!$name) {
        $name = str_replace('.', '-', microtime(true));
    }
    return $name;
}

Upvotes: 0

Related Questions