Base64 编码 .tgz 文件用于 Javascript XHR 调用中的 POST 上传

我正在尝试将POST文件.tgz用作XHR文件上传的一部分。


该文件本身是有效的,我已经通过手动上传对其进行了测试。我遇到的问题(我认为)是当我将文件编码base64并上传时,它已损坏并且未被视为有效。


该文件本身是 Atmail 的插件模块,我已经像我说的那样手动测试了它。


这是我的 base64 截断后的上传功能。


我最初使用以下代码对目标文件进行编码:


cat myfile.tgz | base64 > base64_file


并缩短/删除新行:


sed ':a;N;$!ba;s/\n/ /g' plugin.base64 > t


我的问题是,这是对压缩文件进行编码以便在我的 POST 请求中使用的正确方法吗?如果是这样,我的实施有什么问题?


function uploadPlugin()

{

    var uri = "/index.php/admin/plugins/preinstall";

    var name = "newPlugin";

    filename = "RCE.tgz";

    // Comments and extra lines removed to reduce payload size

    // Remove new lines: sed ':a;N;$!ba;s/\n/ /g' plugin.base64 > t

    var content = "H4sIAAAAAAAAA+0aa2/bOLJfk1/BFYJaLvyIs0m6TZpss30Awe22vabXA65XqLREx2xkSSWppNlu ...";


    var formData = new FormData();

    var blob = new Blob([atob(content)],

        {

            type: "application/x-gtar-compressed"

        }

    )

    formData.append(name, blob, filename);


    var request = new XMLHttpRequest();

    request.open("POST", uri);

    request.send(formData);   

}

这是我正在使用的 ATMail 插件类。


<?php


class Atmail_Test_Plugin extends Atmail_Controller_Plugin

{

    

    protected $_pluginFullName   = 'rce';

    protected $_pluginModule = 'mail';

    

    private $_loginPage = false;


    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)

    {

        $request = $this->getRequest();

        if (($request->getControllerName() == 'index' && $request->getActionName() == 'index') ||

            ($request->getControllerName() == 'auth' && $request->getActionName() == 'logout')) {

            $this->_loginPage = true;

        }

    }


    public function postDispatch(Zend_Controller_Request_Abstract $request)

    {

        if ($this->_loginPage) {

            $page = $this->getResponse()->getBody();

            $page = str_replace("</body>", "<!-- plugins working -->\n</body>", $page);

            $this->getResponse()->setBody($page);

        }

    }

    

慕斯709654
浏览 162回答 1
1回答

慕桂英4014372

我最终发现出了什么问题。我试图错误地发布二进制数据。以下是工作解决方案。function uploadPlugin(){&nbsp; &nbsp; var uri = "/index.php/admin/plugins/preinstall";&nbsp; &nbsp; var name = "newPlugin";&nbsp; &nbsp; filename = "Upload.tgz";&nbsp; &nbsp; var body = "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xed\x1a\x6b\x6f\xdb" +&nbsp; &nbsp; "\x38\xb2\x5f\x93\x5f\xc1\x15\x82\x5a\x2e\xfc\x88\xb3\x49\xba" +&nbsp; &nbsp; "..." +&nbsp; &nbsp; "...";&nbsp; &nbsp; var formData = new FormData();&nbsp; &nbsp; var payload = new Uint8Array(body.length);&nbsp; &nbsp; for (var i = 0; i < payload.length; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; payload[i] = body.charCodeAt(i);&nbsp; &nbsp; }&nbsp; &nbsp; var blob = new Blob([payload])&nbsp; &nbsp; formData.append(name, blob, filename);&nbsp; &nbsp; var xhr = new XMLHttpRequest();&nbsp; &nbsp; xhr.open("POST", uri);&nbsp; &nbsp; xhr.send(formData);&nbsp; &nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript