【问题标题】:Handling file downloads via REST API通过 REST API 处理文件下载
【发布时间】:2017-11-26 20:40:20
【问题描述】:

我想设置 REST API 以支持通过 Java 下载文件(目前不需要 Java 部分——我在这里说的是,您可以针对我的问题做出更具体的回答)。

我该怎么做?

例如,我在一个文件夹 (./java.jar) 中有这个文件,我怎样才能以这样的方式流式传输它以便它可以被 Java 客户端下载?

我忘了说这是一些付费内容。 我的应用应该能够做到这一点

客户端:使用用户名发布到服务器,通过。

Rest:响应用户购买的内容(如果用户购买了该文件,请下载)

客户端:下载文件并放入x文件夹。

我想用 base64 编码一个文件,然后将编码结果发布到通常的 .json 中(也许有一个好听的名字 -- 对 java 应用程序有用,并且里面有代码 -- 虽然我现在不知道应该如何重建文件)。

另外,如果没有必要请不要投反对票,虽然问题中没有代码,但这并不意味着我没有研究过它,只是意味着我什么也没找到适合我的情况

谢谢。

【问题讨论】:

  • 你为什么需要编码任何东西。只需流式传输文件内容,并指定适当的 Content-Type 标头。 REST 并不意味着内容必须是 JSON。

标签: java rest


【解决方案1】:

您需要的是使用有效 URL 的常规文件流式传输。

以下代码摘自here

import java.net.*;
import java.io.*;

public class URLReader {
    public static void main(String[] args) throws Exception {

        URL oracle = new URL("http://www.oracle.com/");
        BufferedReader in = new BufferedReader(
        new InputStreamReader(oracle.openStream()));

        String inputLine;
        while ((inputLine = in.readLine()) != null)
            System.out.println(inputLine);
        in.close();
    }
}

【讨论】:

  • 这确实有效,但不适用于我的上下文。我有一个包含付费内容的应用程序(不应该以任何方式访问那些没有付费的内容)。此外,客户端是完全动态的(它不知道要下载什么,它应该做的是向服务器询问用户登录信息,并据此更新/下载内容)
  • 只需将源移动到密码保护区域下即可。这足以保护。对于动态内容,用户登录后,服务器可以将正确的 URL 传递给客户端。没什么大不了。上面的例子仍然适用。
  • 取决于您的服务器。如果您对此主题有任何疑问,请提出不同的问题。无论是我还是这里的任何其他人都会很乐意回答。
  • @Alp 它确实适用于您的上下文。客户端向服务器发送它需要发送的任何请求,服务器以适当的内容类型和文件的内容(即其字节,没有任何转换)作为正文进行响应。该文件是否可以从外部直接访问,它实际上是一个文件还是只是数据库中的一个 blob 都无关紧要。您只需要发回具有适当内容类型的文件字节即可。
  • @JBNizet 我们在同一页上。我提到文件是因为围绕下载文件的概念提出了问题。如果文件位于密码保护区域后面(在这种情况下,我假设用户只有在付费客户时才注册)。此外,细粒度的控制仍然是可能的。
【解决方案2】:

根据您的需要,根据您在上述答案中更新的 cmets,您可以在用户登录后调用您的 REST 端点(使用 Auth 和您希望接收的其他标头/正文)并继续下载。

将您的 jar/可下载内容转换为字节。更多关于这个 Java Convert File to Byte Array and visa versa

稍后,如果您不想像前面的答案中提到的那样定期流式传输,您可以将字节内容作为 Base64 字符串放在正文中。您可以使用以下内容从字节数组中编码为 Base64。

Base64.encodeToString(byte[],  Base64.NO_WRAP + Base64.URL_SAFE);

来自这里的参考:How to send byte[] and strings to a restful webservice and retrieve this information in the web method implementation

同样,有很多方法可以做到这一点,这是您可能使用 REST 可以做到的方法之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    相关资源
    最近更新 更多