【问题标题】:Uploading data into the $_FILES without a form在没有表单的情况下将数据上传到 $_FILES
【发布时间】:2011-04-23 14:36:10
【问题描述】:

好的,先来个小前言:我一直致力于将拖放文件上传功能添加到名为 Moodle 的课程管理系统(特别是 2.0.1)。这个版本的 Moodle 使用 YUI3 框架,通过 io-upload-iframe 将表单数据与要上传的文件和另存为名称一起上传。该文件存储在超级全局 $_FILES 中,直到文件系统收到有关永久存储位置的相关数据。

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

有人有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    很难说你的问题是什么。但无论你的服务器或文件系统是什么,它都与 $_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
    }
    

    【讨论】:

    • 对不起,我可能并不清楚,我遇到的问题是“YUI 随后发送文件”位。按照设计,文件上传通常是通过表单中的文件输入完成的,该表单已发布,我需要在没有表单的情况下复制它,因为 DND 事件给了我文件,而不是存储它。
    • 当您收到该文件对象时,您就不需要表单了。浏览一些关于 DND 的文章,您可以在上面使用 .getAsDataURL() 方法,然后您可以使用它来制作 AJAX 请求。 -- 我不敢相信没有 YUI 插件可以处理这个问题。
    • .getAsDataURL() 只是通过 FileReader 对象运行一个输入文件,它为您提供了可以使用的数据,例如文本文档。我已经尝试过所有这些与 DND 相关的对象,但它们实际上并没有上传任何东西。正如我所说,我可以使用 XHR 对象将删除的文件发送到另一个 PHP 文件,但我正在使用现有代码,我希望尽可能减少更改。上传文件时还有很多其他参数需要传递。我真正需要的是某种方式来上传没有任何目的地的文件。我不知道这是否可能。
    • 不。这没有多大意义。您可以将文件存储到 .localStorage 中。但是在某些时候,您必须将其发送到某个服务器。还是这张图片是无目的上传的? -- 另外你应该显示一些现有的代码,也许你会得到一个更具体的答案。
    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多