使用PHP,我正在尝试提供大型文件(最多可能为200MB),由于授权问题,这些文件不在Web可访问目录中.目前,我使用一个readfile()
调用以及一些标头来提供文件,但似乎PHP在发送之前将其加载到内存中.我打算在共享托管服务器上部署,这将不允许我使用大量内存或添加我自己的Apache模块,如X-Sendfile.
出于安全原因,我不能让我的文件位于Web可访问目录中.有没有人知道我可以在共享托管服务器上部署的内存密集度较低的方法?
编辑:
if(/* My authorization here */) {
$path = "/uploads/";
$name = $row[0]; //This is a MySQL reference with the filename
$fullname = $path . $name; //Create filename
$fd = fopen($fullname, "rb");
if ($fd) {
$fsize = filesize($fullname);
$path_parts = pathinfo($fullname);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
break;
case "zip":
header("Content-type: application/zip");
break;
default:
header("Content-type: application/octet-stream");
break;
}
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
header("Content-length: $fsize");
header("Cache-control: private"); //use this to open files directly
while(!feof($fd)) …
Run Code Online (Sandbox Code Playgroud) 这可能甚至不需要询问,但我想确保我是对的.在Java中创建任何对象的数组时,如下所示:
Object[] objArr = new Object[10];
Run Code Online (Sandbox Code Playgroud)
该变量objArr
位于堆栈内存中,它指向堆中阵列对象所在的位置.堆中该数组的大小等于12字节对象标头+ 4(或8,取决于参考大小)字节*数组中的条目数.这准确吗?
那么,我的问题如下.由于上面的数组是空的,在执行该行代码后,它是否会在堆中占用12 + 4*10 = 52字节的内存?或者JVM是否会等到你在实例化之前开始将数据放入数组中?数组中的空引用是否占用空间?
所以,我有一个名为的类Puzzle
,以及两个(相关的)构造函数.一个构造函数不接受args,另一个接受一个int,但也抛出异常.基本想法是这样的:
public class Puzzle {
// Fields, methods, etc.
public Puzzle() {
this(3);
}
public Puzzle(int n) throws Exception {
if (n < 2) throw new Exception();
// More constructor code
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这不会编译,因为采用int的构造函数抛出异常,而没有args的构造函数不处理或抛出异常.但是,因为很明显看到异常永远不会抛出(构造函数体中没有抛出异常),这应该不重要.我可以使用这样一个空白的try-catch语句:
public Puzzle() {
try {
this(3);
} catch (Exception e) {
// Never happens
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是调用this(3)
不再是构造函数的第一个语句,因此它不会编译.看起来我必须用一个throws
子句标记这个构造函数,即使我知道它永远不会抛出异常.这真的很烦人,因为调用代码需要有不必要的try-catch块,否则它们也必须抛出异常.我是否缺少一种优雅的方式?我知道我可以轻松地复制和粘贴一些代码,但这与OOP中所有神圣的东西相悖.有任何想法吗?