在没有表单的情况下将数据上传到$ _FILES

时间:2011-04-23 14:36:10

标签: php javascript file-upload drag-and-drop yui

好吧,这么一点前言:我一直致力于将拖放文件上传到名为Moodle的课程管理系统(特别是2.0.1)。此版本的Moodle使用YUI3框架,并通过io-upload-iframe上传表单数据和要上传的文件以及save-as名称。该文件存储在超级全局$ _FILES中,直到向文件系统发送永久存储它的相关数据。

我遇到的麻烦是,而不是使用YUI3的拖放功能(从粗略看看他们的网站不是我需要的那种拖放)我正在使用本机HTML5拖动和丢弃代码。这似乎适用于大多数主流浏览器(我没有时间进行大量测试,这超出了本项目的范围)。我遇到的麻烦是这种DND设计会立即从javascript中的Event对象中提供一个文件。我可以将此文件对象发送到我想要的任何地方,但文件系统仅用于处理临时存储在$ _FILES变量中的变量。遗憾的是,我无法找到任何简单的方法来存储此文件。我可以使用各种形式的HTTP请求(YUI3的特殊Y.io()请求之一或XHR),但这需要原始源代码中的大量重复代码。

有人有什么建议吗?

1 个答案:

答案 0 :(得分:0)

很难说出你的问题是什么。但无论你的服务器或文件系统是什么,它都与$ _FILES数组的临时性无关。

当您收到DND事件并且YUI随后发送文件时,您将在$ _FILES或$ _POST中收到一些数据。如果是这样,请使用move_uploaded_filefile_put_contents并将其存储在其他地方

将该移动的文件指定为md5()哈希作为名称,并将其作为AJAX-DND上传请求的文件标识符返回。

然后,您可以在Javascript代码中使用该哈希ID,并通过此引用引用已上载的图像文件。如果您的应用程序在拖放后启动了正常的表单请求,那么您只需包含收集的图像引用ID。因此,您的服务器端代码可以再次关联它。

如果你想要,你甚至可以重建$ _FILES数组:

foreach ((array)$_POST["prev_image_ids"] as $md5) {
    $md5 = basename($md5);
    $_FILES["image"][] = array(
        "tmp_name" => $fn="./already-uploaded/$md5",
        "size" => filesize($fn), "type"=>"image/whatever",
        "name" => "unknown.jpg", "error"=>UPLOAD_ERR_OK,
    );   // you could store away those original attributes too
}