我的网络服务器的非公共文件夹中有一个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.它们是否应该相同?
答案 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();