【问题标题】:Silverstripe: Frontend form with file upload could overwrite existing filesSilverstripe:带有文件上传的前端表单可能会覆盖现有文件
【发布时间】:2015-01-15 22:46:21
【问题描述】:

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

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

问候, 约斯特。

【问题讨论】:

  • 您使用什么表单域进行上传? FileField 还是 UploadField?
  • 我正在使用 UploadField。那个将 replaceFile 设置为 1,所以目前我正在尝试扩展 Upload 本身(并注入它来替换上传)以强制它生成一个唯一值。
  • 听起来是个好主意。 Upload还有一个设置可以重命名上传的文件而不是替换!见api.silverstripe.org/3.1/class-Upload.html#_setReplaceFile 也许你必须抑制 UploadField 的覆盖警告。祝你好运,请发布你的工作结果;)
  • 我正试图这样做:-)

标签: silverstripe


【解决方案1】:

嗯,最后我找到了以下解决方案。上传类有一个设置,允许您指定是否替换图像或是否更改图像文件名,然后上传。有趣的是,默认设置为不替换。

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

因此我决定创建一个新的上传类,并用它替换旧的:

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

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

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

Injector:
  Upload:
    class: VBUpload

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

【讨论】:

  • 您好先生@jberculo,我们可以将它复制为扩展吗?我现在在 SS4 上,我似乎无法在管理 CMS 中启用覆盖功能
  • 不,抱歉。没有出现需要:)
猜你喜欢
  • 1970-01-01
  • 2020-09-28
  • 2016-04-22
  • 2022-06-21
  • 2018-09-16
  • 1970-01-01
  • 2021-01-09
  • 2017-09-02
  • 1970-01-01
相关资源
最近更新 更多