jquery文件上传 - 如何覆盖文件NOT rename

时间:2013-02-09 10:17:34

标签: jquery-ui jquery-plugins file-upload overwrite blueimp

我正在努力更新Jquery文件上传插件,因此当您上传文件时,它只会覆盖具有相同名称的现有文件,而不是使用upcount重命名。

我已应用此链接中涵盖的更改:https://github.com/blueimp/jQuery-File-Upload/issues/1965

但我似乎无法覆盖此插件以使其正常工作?

现在还有一个未解答的问题:jQuery File Upload by bluimp, how to replace instead of renaming

对此的任何指导都将非常感激。

7 个答案:

答案 0 :(得分:8)

如果您使用维基中存在的UploadHandler.php,那很简单。在get_file_name方法中,您应该替换此行:

    return $this -> get_unique_filename($this -> trim_file_name($name, $type, $index, $content_range), $type, $index, $content_range);

用这个:

 return $this -> trim_file_name($name, $type, $index, $content_range);

答案 1 :(得分:4)

2016更新 MKoosej 修复! 在 UploadHandler.php →受保护的函数get_file_name ... 取代

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
    );

return $this -> trim_file_name($file_path, $name, $size, $type, $error, $index, $content_range);

答案 2 :(得分:2)

我需要相同的文件覆盖选项。

使用PHP UploadHandler.php文件我做了一个非常快速的黑客攻击对我有用。 我确信有更好的方法,但这可能有助于其他人。

查找处理程序'upcount_name_callback'并将return语句替换为取出的(索引)编号。我离开原来的退货声明,以防我需要回去:)

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

答案 3 :(得分:0)

考虑github上的文档(here)并向下滚动到“如何在上传生命周期中将文件绑定到元素节点”的位置。这是代码:

$(function () {
    $('#fileupload').fileupload({
        dataType: 'json',
        add: function (e, data) {
            data.context = $('<p/>').text('Uploading...').appendTo(document.body);
            data.submit();
        },
        done: function (e, data) {
            data.context.text('Upload finished.');
        }
    });
});

注意完成回调功能。如果您展开数据对象,则会注意到 data.files 对象以及 data.result 对象。 data.result 包含服务器上文件的名称。因此,服务器上新上传文件的名称是 data.result.files [0] .name ,基于上面给出的示例脚本。

我希望这有助于某人

答案 4 :(得分:0)

我尝试了@MKoosej的解决方案。在我的情况下它工作正常,但我也编辑trim_file_name我在其中只返回一个文件名(我必须做一个上传器,将任何文件名转换为data.csv)。此外,我不得不制作其他版本的上传器,我应该重写文件名而不是重命名,但不同名称的不同文件应保持不同。所以,当我在那里尝试@MKoosej解决方案时,它开始上传文件只有.jpeg这样的扩展名没有文件名。 所以,我找到了这个解决方案: 在func get_unique_filename一开始我把它放在:

$oldName=$name;

并返回$oldName而不是$name,这很好。

答案 5 :(得分:0)

Anno 2018,这也可以正常使用(PHP 7.1):

class MyUploadHandler extends UploadHandler
{
    public function __construct($options = array(), $initialize = true, $error_messages = null) {
        $options += array(
            'overwrite_existing' => true
        );

        parent::__construct($options, $initialize, $error_messages);
    }

    protected function get_unique_filename($file_path, $name, $size, $type, $error, $index, $content_range) {
        if ($this->options['overwrite_existing'] ?? false) {
            return $name;
        }

        return parent::get_unique_filename($file_path, $name, $size, $type, $error, $index, $content_range);
    }
}

它避免了更改原始代码的麻烦,该原始代码随后可以用作库。

答案 6 :(得分:-2)

只需在回调中执行ajax请求即可开始上传并从数据磁盘中删除文件。您可以使用data.files [0] .name。

找到文件名

然后您只需使用旧链接搜索tr,如下所示:

$("a[title='"+ data.files[0].name + "']").each(function () {
        $(this).closest('tr').fadeOut();
    });

并淡出它。

此致