Silverstripe:带有文件上传的前端表单可能会覆盖现有文件

Silverstripe: Frontend form with file upload could overwrite existing files

我 运行 遇到了我的一个项目的小问题。我有一个工作的前端表单,可用于将图像放入数据对象并保存。到目前为止没问题,但它是一个化身,所以当我的一个用户上传 avatar.png 时,它可能会被另一个使用相同文件名的用户覆盖。这是预期的 Silverstripe 行为,但在我的情况下是不需要的。

是否可以在图像名称前加上一个字符串,例如用户名(唯一的)?当然,在一个只会发生在前端的完美世界中,但我会满足于更少:-)

此致, 约斯特.

好吧,最后我找到了以下解决方案。上传 class 有一个设置,可让您指定是否替换图像或是否更改图像文件名,并且仍然上传。有趣的是默认设置为不替换。

我正在使用的表单字段 class 是 UploadField,它扩展了使用上传 class 的 FileField。默认情况下,UploadField class 设置上传替换旧文件,使用 Upload->setReplaceFile(true).

因此我决定创建一个新的上传 class,并将旧的替换为:

class VBUpload extends Upload {
    public function setReplaceFile($bool) {
        if(strpos($_SERVER["REQUEST_URI"],'admin/')===false) {
            $this->replaceFile = false;
        } else {
            $this->replaceFile = $bool;
        }
    }
}

我只希望在从前端调用时更改默认工作方式,也许有更简洁的方法来实现它。但是这个对我有用。

接下来唯一要做的就是强制系统实际使用 class,所以我将其添加到 /mysite/_config/config.yml:

Injector:
  Upload:
    class: VBUpload

这可能也可以通过普通扩展来完成,但我会在需要时进行更改:-)