为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯709654 2022-12-18 16:00:46
我正在尝试将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 插件类。<?phpclass 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);        }    }    
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

我最终发现出了什么问题。我试图错误地发布二进制数据。以下是工作解决方案。


function uploadPlugin()

{

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

    var name = "newPlugin";

    filename = "Upload.tgz";

    var body = "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xed\x1a\x6b\x6f\xdb" +

    "\x38\xb2\x5f\x93\x5f\xc1\x15\x82\x5a\x2e\xfc\x88\xb3\x49\xba" +

    "..." +

    "...";


    var formData = new FormData();


    var payload = new Uint8Array(body.length);


    for (var i = 0; i < payload.length; i++)

    {

        payload[i] = body.charCodeAt(i);

    }


    var blob = new Blob([payload])

    formData.append(name, blob, filename);


    var xhr = new XMLHttpRequest();

    xhr.open("POST", uri);

    xhr.send(formData);   

}


查看完整回答
反对 回复 2022-12-18
  • 1 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号