1

我需要将文件 (.zip) 从客户的第三方网站传输到我的网站。

GM-Snippet(注释掉其他尝试)

 GM_xmlhttpRequest({
    method: "GET",
    url: dlurl,
    timeout:0,
    onload: function(resp) {
    var conti=resp.responseText;

alert("goup");
GM_xmlhttpRequest({
    method: "POST",
    url: "http://absolut-fair.com/wbb_back/api.php?id=3",
    overrideMimeType: 'text/plain; charset=x-user-defined',
    data:"chk=1&data="+base64_encode(conti),
    headers: {
            "Content-Type": "application/x-www-form-urlencoded"
    },
    onload: function(resp) {
        var conti=resp.responseText;

        if(conti=="1") alert("upload erfolgreich");
        else alert(conti);
//....

PHP 片段

$name="test.txt";
uploadfile(base64_decode($_POST["data"]),detect_mime($name),$name);

问题

当我尝试打开它们时,所有解码的文件都已损坏。问题是发送二进制数据。发送原始文本效果很好!

//更新

我刚刚下载了健康和无效的 zip 文件,看起来无效的文件处理了大量的空间来填充无用的代码段。所以我觉得base64不能完全编码/解码二进制数据。任何人有任何知识?

我附上来源的屏幕截图以使其清楚!

有效文件:

有效文件

无效的:

无效的

4

1 回答 1

1

由于我无法在这里获得帮助,我向德国社区“gulli”的一位名叫“Kugelfisch23”的经验丰富的用户寻求帮助,并将这个主题发送给他。

现在我们解决了问题,我想为其他尝试通过 Greasemonkey 发送二进制文件并使用 PHP 接收它的用户提供更多信息。

如果你也从事这种工作,我建议先发送一个像这样的小示例文件,因为它包含所有二进制字符。因此,您将能够检查问题发生在哪里,如果可能的话,最有可能的是编码/解码出错了。


第一个问题:接收二进制数据

正如您在开头的示例中看到的那样,我在发送二进制数据时覆盖了 mime 类型但在接收时没有覆盖。因此,对象responseText仅包含 UTF-8 字符并损坏数据。=> 接收时也需要覆盖 MIME 类型。

GM_xmlhttpRequest({
    method: "GET",
    url: dlurl,
    timeout:0,
    overrideMimeType: 'text/plain; charset=x-user-defined',
    //...

第二个问题:将二进制数据编码为base64

由于不可能简单地将二进制数据作为 POST 参数发送,因此需要对数据进行编码以使其可发送。在第一次尝试中,我使用了这个base64_encode - 函数来编码我的数据。正如我后来发现的那样,此功能是否仅提供不足以发送二进制数据的转换,并且应该主要用于对文本进行编码。 此函数(指函数base64Encode(str),不要与 混淆base64ArrayBuffer)而是能够对二进制数据进行编码。

第三个问题:发送base64

通过 post 发送 base64 编码的结果是不够的,因为它包含许多 PHP-Endpoint 无法处理或转换为无效字符的字符。encodeURIComponent在发送之前使用base64-result。

第四题:接收与解码

尽管解码传入的数据相当简单,但我会为您提供我的片段。

if(empty($_POST["data"])) die("no data sent");  
$name="test.zip";
$binary=base64_decode($_POST["data"]);

结果

Greasemonkey/JS

        var dlurl = "http://website.zip";
        GM_xmlhttpRequest({
            method: "GET",
            url: dlurl,
            overrideMimeType: 'text/plain; charset=x-user-defined',
            timeout:0,
            onload: function(resp) {
                var conti=resp.responseText;
                var encoded = encodeURIComponent(base64Encode(conti));
                GM_xmlhttpRequest({
                    method: "POST",
                    url: "http://absolut-fair.com/wbb_back/api.php?id=3",
                    overrideMimeType: 'text/plain; charset=x-user-defined',
                    data:"data="+encoded,
                    headers: {
                            "Content-Type": "application/x-www-form-urlencoded"
                        },
                    onload: function(resp) {
                     //...

PHP

参见第 4 个问题的代码

于 2012-12-13T11:58:45.070 回答