【问题标题】:ExpressionEngine SAEF File upload to specific directoyExpressionEngine SAEF 文件上传到特定目录
【发布时间】:2011-06-08 22:11:12
【问题描述】:

我正在使用表达式引擎 2.x 并尝试为前端用户创建文件上传表单,上传的文件将存储在以登录用户 ID 命名的文件夹中。我们可以使用 saef 或 safecracker 来做到这一点吗?如果没有,还有其他选择。

【问题讨论】:

    标签: php expressionengine


    【解决方案1】:

    SafeCracker 捆绑了一个字段类型SafeCracker File,用于创建文件上传字段。字段类型利用您在控制面板中创建的任何 File Upload Directories

    默认情况下,所有上传的文件都将存储在文件上传目录首选项中指定的目录中。

    为了将 SafeCracker 文件上传到以登录用户 ID 命名的子文件夹,您可以开发自定义插件,或利用 compatible fieldtype that works with SafeCracker -- 如果存在满足您的需求。

    SafeCracker 的替代方法是使用Solspace Freeform Module。但是,即使这样做,您的文件上传仍将全部保存到同一个文件上传目标,而不是嵌套在子文件夹中。

    【讨论】:

    • 谢谢,但您的回答对我没有帮助。如果我是附加组件,我不会问这个问题。我们可以修改safecracker文件,告诉它寻找safecracker标签中指定的上传目录吗?
    • Developer API 允许您扩展ExpressionEngine 的功能时,您为什么要破解 SafeCracker 的代码或其捆绑的字段类型?为了实现您想要的功能,您最好的解决方案是编写一个插件或字段类型。这里是a simplified example,可以帮助您入门。
    • 只是对它的工作原理有点困惑。你的意思是只为文件字段编写一个插件。假设我创建了一个文件上传插件,它接受文件路径作为标签属性。 {exp:fileupload property='/path/'} 那将如何与 saef 交互。会不会基于提交点击。
    【解决方案2】:

    在这种情况下,由于 SafeCracker 没有任何扩展挂钩,并且我知道没有允许此特定行为的附加组件,我会制作 SafeCracker 文件的副本并对其进行更改以添加此功能。否则,您只是从头开始使用自己的“上传文件”字段类型。

    您需要查看 ft.safecracker_file.php 中的第 148 行,并添加一些代码来检查是否存在具有登录用户的屏幕名称的目录或您有什么 (@987654321 @),如果没有,则创建它,然后将该目录名称附加到上传路径:

    $data = $this->EE->filemanager->upload_file($this->settings['safecracker_upload_dir'].'/'.$users_directory_name, $field_name);
    

    我认为这应该让你开始。

    【讨论】:

    • 这似乎是一个明智的解决方案。我会试试看。
    • 这不起作用。上传图片时出现错误You have not specified any allowed file types.The filetype you are attempting to upload is not allowed.
    • 您要上传什么样的文件?是否开启了 XSS 过滤?
    • 我尝试上传 gif 文件。这就是我为测试$data = $this->EE->sc_filemanager->upload_file($this->settings['safecracker_upload_dir'].'/test/', $field_name); 所做的。我在测试之前创建了测试文件夹。但它给了我文件类型错误。如果我删除'./test/'那么它可以工作。
    • 抱歉,我的错误。 $this->settings['safecracker_upload_dir'] 不是目录路径,而是 EE 中预定义上传目录的整数 ID,这是 Filemanager 类的 upload_file 函数需要的。您可能需要为此深入挖掘并编写自己的字段类型。