Base64 encode.tgz文件,用于Javascript XHR调用中的后期上载

Base64 encode.tgz文件,用于Javascript XHR调用中的后期上载,javascript,Javascript,我正在尝试使用XHR作为文件上载的一部分,发布a.tgz文件 该文件本身是有效的,我已经通过手动上传进行了测试。我(我想)遇到的问题是,当我将文件编码到base64并将其上载时,该文件已损坏,无法作为有效文件获取 该文件本身是Atmail的一个插件模块,正如我所说,我已经手动测试过了 这是我的上载函数,其中base64被截断 我最初使用以下代码对目标文件进行编码: cat myfile.tgz|base64>base64_文件 以及缩短/删除新线路,包括: sed:a;N、 美元!文学士;s/\

我正在尝试使用
XHR
作为文件上载的一部分,发布
a
.tgz
文件

该文件本身是有效的,我已经通过手动上传进行了测试。我(我想)遇到的问题是,当我将文件编码到
base64
并将其上载时,该文件已损坏,无法作为有效文件获取

该文件本身是Atmail的一个插件模块,正如我所说,我已经手动测试过了

这是我的上载函数,其中base64被截断

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

cat myfile.tgz|base64>base64_文件

以及缩短/删除新线路,包括:

sed:a;N、 美元!文学士;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);
        }
    }
    
    
    public function setup()
    {
        $db = zend_Registry::get("dbAdapter");
        $db->query("drop table if exists `TestPluginSettings`");
        $db->query("create table `TestPluginSettings` (`id` int auto_increment primary key, `keyName` varchar(12), `keyValue` text, index `keyName` (`keyName`))");
        
    }
    
    
    public function setViewRenderScript()
    {
        //return "/path/to/nothing.phtml";
    }
    
    
    public function setViewRenderAction()
    {
    }
}

我最终发现了问题所在。我试图错误地发布二进制数据。以下是有效的解决方案

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);   
}
函数上传插件()
{
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有效载荷=新的Uint8Array(body.length);
对于(变量i=0;i
我最终发现了问题所在。我试图错误地发布二进制数据。以下是有效的解决方案

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);   
}
函数上传插件()
{
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有效载荷=新的Uint8Array(body.length);
对于(变量i=0;i
为什么不将其作为正确的文件上传发送?XHR和fetch都支持这一点……你能说明你的意思吗?为什么不把它作为正确的文件上传发送呢?XHR和fetch都支持这一点……你能说明你的意思吗?