"Blueimp jQuery文件上传" 重命名文件

13

我正在使用Blueimp jQuery文件上传工具。我想要在上传时完全重命名文件。由于照片是根据userID添加到唯一目录中的,所以我只想使用名称001.jpg、002.jpg、003.jpg等添加照片。我该如何实现这一点(通过修改UploadHandler.php或index.php)?

在index.php中(下面的代码当前更改了上传目录):

$userID = 'user005'; //hardcoded in this example
$options = array('upload_dir'=>'files/'.$userID.'/', 'upload_url'=>'files/'.$userID.'/');
$upload_handler = new UploadHandler($options);

https://github.com/blueimp/jQuery-File-Upload/wiki - user2755541
7个回答

27

虽然这是一篇旧帖,但由于我今天也在搜索同样的问题,所以我发布我的解决方案,希望能帮助到其他人。

我以这种方式编辑了UploadHandler.php文件:

        //custom function which generates a unique filename based on current time
        protected function generate_unique_filename($filename = "")
            {

                $extension = "";
                if ( $filename != "" )
                {
                    $extension = pathinfo($filename , PATHINFO_EXTENSION);

                    if ( $extension != "" )
                    {
                        $extension = "." . $extension;
                    }
                }

                return md5(date('Y-m-d H:i:s:u')) . $extension;
            }


            protected function handle_file_upload($uploaded_file, $name, $size, $type, $error,
                    $index = null, $content_range = null) {
                $file = new \stdClass();

                //MYEDIT to generate unique filename
                $file->name = $this->generate_unique_filename($name);

                //ORIGINAL LINE: $file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error, $index, $content_range);

                //...
}

非常好用,谢谢! - BWDesign
2
如果有人一次上传多张图片,比如按住Ctrl键并同时选择3张图片,你该如何让它们正常工作? - anthony
1
首先,您应该检查您的PHP上传变量是一个数组(多文件上传)还是单个对象。在第一种情况下(您的情况),使用foreach循环如下:foreach ($upload['tmp_name'] as $index => $value) { $files[] = $this->handle_file_upload($upload['tmp_name'][$index],$file_name ? $file_name : $upload['name'][$index],$size ? $size : $upload['size'][$index],$upload['type'][$index], $upload['error'][$index],$index,$content_range );}(来源:BlueImp jQuery文件上传插件PHP类8.1.0) - SaganTheBest
1
你可能会在使用md5时遇到冲突。最好使用类似于md5(rand()).time()的方法。 - user151496

2

对于那些只想通过$options传递name的人:

替换(第1056行?)

$file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error, $index, $content_range);

使用

$extension = pathinfo($name , PATHINFO_EXTENSION);
if ( $extension != "" ){
    $extension = "." . $extension;
}

$file->name = (isset($this->options['filename']) && isset($extension) ) 
     ? $this->options['filename'] . $extension
     : $this->get_file_name($uploaded_file, $name, $size, $type, $error, $index, $content_range);

然后像这样在选项中给出名称:

$upload_handler = new UploadHandler(array(['filename' => 'whatever' ]));

1

为什么不尝试使用uniqid()来生成唯一的名称?

protected function generate_unique_filename( $filename = "" )
{
    $extension = "";
    if ( $filename != "" )
    {
        $extension = pathinfo( $filename, PATHINFO_EXTENSION );

        if ( $extension != "" )
        {
            $extension = "." . $extension;
        }
    }
    return md5( uniqid() ) . $extension;
    //or simply return uniqid() . $extension;
}       

1

谢谢你!

但我有一个问题,我想用一个字段标题来重命名,我尝试使用以下代码:

protected function handle_form_data($file, $index) {
    $file->title = @$_REQUEST['title'][$index];
}
protected function generate_unique_filename($filename = "") {
    $extension = "";
    if ( $filename != "" )
    {
        $extension = pathinfo( $filename, PATHINFO_EXTENSION );
        if ( $extension != "" ) {
            $extension = "." . $extension;
        }
    }
    return $file->title . $extension;
}

但是每次我都会收到一个JSON错误... (@$_REQUEST['title'][$index]; 的工作很好,我用它来保存在我的数据库中)

0

对于多个文件下载,我按照SananTheBest的建议添加了一些代码。实际上,之前无法上传文件的原因是文件名相同,即使使用日期作为文件名也是如此(感谢您)。

protected function generate_unique_filename($filename = "")
{

    $extension = "";
    if ( $filename != "" )
    {
        $extension = pathinfo($filename , PATHINFO_EXTENSION);

        if ( $extension != "" )
        {
            $extension = "." . $extension;
        }
    }
    //$filenamegen = date('ymdHis').generateRandomString();
    $characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $charactersLength = strlen($characters);
    $randomString = "";
    for ($i = 0; $i < 5 ; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }


    //$filenamerandom=$filename.".jpg";
    //return md5(date('Y-m-d H:i:s:u')). $extension;

    return date('ymdHis').$randomString . $extension ;
}

0

编辑UploadHandler类中的$name变量以获取唯一文件名。请参见代码

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

0

get_file_name 方法是实际命名发生的地方。 为了避免过多的变通方法,直接按照以下方式进行编辑:

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);
    //don't return this right away; parse it to a variable
    $unique_file_name = $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
    );
    //generate your custom name here
    $custom_name = uniqid('profilepic');
    //extract file extension
    $file_extension = pathinfo($unique_file_name, PATHINFO_EXTENSION);
    return $custom_name.'.'.$file_extension;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接