好吧,这么一点前言:我一直致力于将拖放文件上传到名为Moodle的课程管理系统(特别是2.0.1)。此版本的Moodle使用YUI3框架,并通过io-upload-iframe上传表单数据和要上传的文件以及save-as名称。该文件存储在超级全局$ _FILES中,直到向文件系统发送永久存储它的相关数据。
我遇到的麻烦是,而不是使用YUI3的拖放功能(从粗略看看他们的网站不是我需要的那种拖放)我正在使用本机HTML5拖动和丢弃代码。这似乎适用于大多数主流浏览器(我没有时间进行大量测试,这超出了本项目的范围)。我遇到的麻烦是这种DND设计会立即从javascript中的Event对象中提供一个文件。我可以将此文件对象发送到我想要的任何地方,但文件系统仅用于处理临时存储在$ _FILES变量中的变量。遗憾的是,我无法找到任何简单的方法来存储此文件。我可以使用各种形式的HTTP请求(YUI3的特殊Y.io()请求之一或XHR),但这需要原始源代码中的大量重复代码。
有人有什么建议吗?
答案 0 :(得分:0)
很难说出你的问题是什么。但无论你的服务器或文件系统是什么,它都与$ _FILES数组的临时性无关。
当您收到DND事件并且YUI随后发送文件时,您将在$ _FILES或$ _POST中收到一些数据。如果是这样,请使用move_uploaded_file
或file_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
}