【问题标题】:How to make base64 encoded file received via REST api GET request available for download如何使通过 REST api GET 请求接收的 base64 编码文件可供下载
【发布时间】:2023-03-14 05:31:02
【问题描述】:

所以我通过 REST api GET 请求接收文档,该请求返回 JSON,其中包含作为 base64 编码数据的文件以及有关文件的元数据,例如文件名和描述。

这是一个返回 JSON 的示例(为了便于阅读,将真实的 base64 数据替换为“BASE64 ENCODED FILE”):

"documents":[  
    {  
        "name":"Job Description.doc",
        "description":"Job Description",
        "data":"BASE64 ENCODED FILE"
    },
    {  
        "name":"Person Description.doc",
        "description":"Person Description",
        "data":"BASE64 ENCODED FILE"
    }
]

我知道我可以json_decode() 数据,然后做:

file_put_contents('/path/to/file/'.base64_decode($documents->data));

这样做的问题是该文件随后被永久存储(在这种情况下这是不可接受的)。我想知道是否有任何方法可以提供文件以供下载,而无需将其作为文件存储在任何地方。可能类似于如何将 base64 编码的图像用作图像标签的来源。

你的想法是什么?这个可以吗?

【问题讨论】:

    标签: json rest base64


    【解决方案1】:

    您的服务器上似乎正在使用 php。

    据我了解:

    1. 您的访问者客户端/浏览器向您的服务器发出请求,
    2. 您的服务器运行一些 php 代码并向另一台服务器发起 REST 请求,
    3. 您的服务器收到 json 数据,以响应您的 REST 请求,
    4. 您的 php 代码将响应发送到您的访问者客户端/浏览器(或完成响应),
    5. (可选)您的 php 代码在发送响应后执行一些操作。

    问题是,在流程结束时,您必须将文档内容保存在某处,或者将其传输到您的访问者客户端/浏览器。否则它会丢失您的服务器(并且,除了在某些特殊情况下,我宁愿避免多次执行传递文件内容的 REST HTTP 请求)。

    在数据丢失之前,在响应中将所有文件传输给访问者是可能的。一种方法如下:

    1. 您的访问者点击了一个链接(在您的服务器上发起 REST 请求...)
    2. 作为响应,您的访问者会收到一个下载文件(例如 zip 文件或 tar.bz2...)。

    另一种似乎可行的方法是将 HTML 内容发送到您的浏览器,其中包含所有已编码的文件内容。然后客户端代码将完成剩下的工作。我不确定我是否会这样做,但你可以看看https://stackoverflow.com/a/3916267/1106814

    但是,除非我有特殊情况,否则我宁愿将文件内容临时“保存”在服务器上。有多种方法可以获得可接受的解决方案:

    • 使用 cron 机制清除过期内容
    • 使用 tmpfs(或类似的)解决方案来增加临时文件甚至不写入物理磁盘的可能性
    • 可能还有很多其他方式...

    我希望提供有用的想法。

    【讨论】:

    • 对我的选择的一个很好的概述。这很有帮助。感谢您的宝贵时间。
    猜你喜欢
    • 2021-02-23
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2021-04-24
    • 2013-08-20
    相关资源
    最近更新 更多