PHP 为 Java 应用程序提供下载服务

PHP to serve download for a Java application

我想知道如何使下载服务器更健壮。现在,我有一个服务器,在 https 上,存储 zip 文件,用随机哈希命名,由我的数据库索引。包含的目录不允许列出(htaccess),避免手动下载直接浏览服务器上的目录。

Java应用程序会显示文件的描述,如果用户要下载它,只需点击下载即可。 Java 应用程序,如果允许该用户下载,将凭据发送到服务器上我的 PHP 脚本,PHP 脚本检查它们,再次检查是否允许该用户下载该文件,从由用户要下载的文件 ID 索引的数据库中检索 filename.zip,并回显该文件名。 Java 应用读取该文件名并使用

下载文件
Url url = new URL("https://myserver.com/assets/theAssetToDownload.zip")
URLConnection urlConn = url.openConnection();

InputStream is = urlConn.getInputStream();
FileOutputStream fos = new FileOutputStream("test.zip");

byte[] buffer = new byte[4096];
int len;

while ((len = is.read(buffer)) > 0) {
    fos.write(buffer, 0, len);
}

(缩短了代码,需要 try/catch、is/fos.close() 等等)

到目前为止一切顺利,运行良好...但是...如果有人在浏览器中直接输入 url,文件也会被下载,而无需明确检查授权。 ..

所以我想,嘿,除了 PHP 脚本之外,不要让任何人访问资产目录!同样,这是一个简单的 htaccess。

但是下载是如何进行的呢?

那会是 header 并在我的 PHP 脚本中输出,例如:

header("Content-type: application/octet-stream");
header("Content-disposition: attachment;filename=test.zip");
readfile(test.zip);

在那种情况下,我如何从 Java 方面读取它?还有 getInputStream()?

我知道这个问题很笼统。我怎样才能安全地做到这一点?

您可以将文件存储在无法从 Web 访问但 Web 服务器仍可读取的位置,然后使用 htaccess 将所有请求路由到您的 php 脚本。将它与您已经拥有的(headers,使用 readfile 输出)和授权相结合,就应该如此。