【问题标题】:PHP to serve download for a Java applicationPHP 为 Java 应用程序提供下载服务
【发布时间】:2015-12-06 11:26:23
【问题描述】:

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

Java 应用程序显示文件的描述,如果用户想要下载它,他只需单击下载。 Java应用程序,如果允许该用户下载,则将凭据发送到服务器上的我的PHP脚本,PHP脚本检查它们,再次检查该用户是否被允许下载该文件,从索引的数据库中检索filename.zip用户想要下载的文件 ID,并回显该文件名。 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。

但是如何提供下载服务呢?

这会是我的 PHP 脚本中的标题和输出,例如:

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

在这种情况下,我如何从 Java 端读取它?还有一个 getInputStream()?

我明白这个问题是笼统的。我怎样才能安全地做到这一点?

【问题讨论】:

  • 这里的问题只是您提供了这些文件的直接 http 下载。你不应该。而不是返回文件名,因此间接地下载文件的 url 您应该返回文件的 content。就是这样。
  • 是的,我知道这个问题,这就是为什么我决定询问那些肯定知道该怎么做的人,然后再重写我想确保应该使用 header/readfile 方法的所有内容。谢谢你的回答!
  • 嗨@Psychokiller1888。只是一个简短的说明 - 我们鼓励帖子作者在这里接受对其材料的良好编辑。见帮助文章Why can people edit my posts?如果作者的意思发生了变化,那么再次编辑是可以的,但是这里不是这样。

标签: java php download serving


【解决方案1】:

您可以将文件存储在 Web 无法访问但仍可供 Web 服务器读取的位置,然后使用 htaccess 将所有请求路由到您的 php 脚本。将其与您已有的(标题、带有 readfile 的输出)和授权相结合,就应该这样了。

【讨论】:

  • 感谢您的回答!在 Java 方面,如何在 PHP readfile() 之后重建文件?
  • 好的,让它工作,就像我已经拥有的一样简单,getInputStream() 就可以了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 2020-09-27
相关资源
最近更新 更多