从非公共文件夹(php)获取zip文件

时间:2016-08-24 07:07:49

标签: javascript php zip

我的网络服务器的非公共文件夹中有一个zip文件。我想让公众无法访问该文件,所以我希望使用php readfile来读取zip文件,并在javascript中从zip文件创建一个File对象。我不确定这是否是做这样的事情的最佳方式,但我会很感激任何建议。

如何使用返回的数据构建File对象?

这是我的PHP代码(getZipFile.php):

<?php

$filename = "abc.zip";
    $filepath = "/path/to/zip/";

    // http headers for zip downloads
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"".$filename."\"");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize($filepath.$filename));
    ob_end_flush();
    $buffer = readfile($filepath . $filename);
    echo $buffer;
?>

这是我的javascript代码

$.ajax({
        url: 'getZipFile.php',
        error: function(e) {
            console.log(e);
        },
        dataType: 'text',
        success: function(data) {
            console.log(data);

            var parts = [
              new Blob([data], {type: 'application/zip'}),
              new Uint16Array([33])
            ];

            var f = new File(parts, "myzip.zip");
        },
        type: 'GET'
    });

我注意到的一件事是原始Zip文件的大小是2302字节,当我在success函数中打印data.length时,数据长度是2287.它们是否应该相同?

2 个答案:

答案 0 :(得分:1)

$ buffer来自哪里?另外你似乎没有发送文件,你应该添加:

echo readfile($filepath . $filename);

您还可以添加一些控件来检查文件是否存在,但这超出了您的问题的范围。

答案 1 :(得分:1)

我最终使用XMLHttpRequest来处理请求并指定blob作为我的返回数据类型。这是我的最终代码。

php代码:

<?php
ob_start();
$filename = "abc.zip";
$filepath = "/path/to/zip/";
$zip = $filepath . $filename;
header("Content-type: application/zip");
header("Content-Length: ".filesize($filepath.$filename));
ob_clean(); 
flush();
readfile($filepath . $filename);
exit;

javascript代码:

var oReq = new XMLHttpRequest();
oReq.open("GET", "getZipFile.php", true);
oReq.responseType = "blob";
oReq.onload = function(oEvent) {
    var data = oReq.response;
    var f = new File([data], "myzip.zip", {
        lastModified: new Date(0),
        type: "application/zip"
    });
};
oReq.send();