WP_REST_Response下载文件

时间:2017-06-13 14:14:31

标签: php wordpress rest wordpress-rest-api

是否可以使用WordPress中的WP_REST_Response返回文档(生成的PDF,CSV)?

到目前为止,我一直在使用register_rest_resource注册自定义端点,但如果我尝试返回文件(例如使用PHP fpassthru($f)readfile($f),我会收到“已发送的标头”错误。

使用其他词语:如何使用Wordpress REST API返回文件?

感谢任何帮助!

由于

2 个答案:

答案 0 :(得分:0)

(我自己很快就需要这个,所以制定了一个可能不完整的答案)

与 WP Media 核实后,我们收到了 .../?rest_route=/wp/v2/media/IDJSON API 响应,其中包含所请求的媒体文件的链接。

接下来,即 source _url 的图像之一包含 .../wp-content/uploads/2021/06/Screenshot-2021-06-18-at-10.25.05-150x150.png

按照注释(不要流式传输二进制文件而是链接)将文件添加到 WP Media 集合,或者自定义端点可以使用链接到生成并存储的文件的类似响应进行响应。

然后任何与 JSON API 兼容的客户端都可以执行所需的操作。在这种情况下生成一个下载链接。

答案 1 :(得分:0)

您不能使用 WP_REST_Response 来执行此操作。但是,可以使用 rest api 返回其他内容。

如果您绝对确定您已准备好完整响应(包括标头,例如用于下载的 Content-Disposition),您可以在生成最终响应后简单地 exit;。请注意,这会完全绕过之后会调用的任何钩子,因此请谨慎使用。

.csv 示例

$filename = 'example-file.csv';
header("Access-Control-Expose-Headers: Content-Disposition", false);
header('Content-type: text/csv');
header("Content-Disposition: attachment; filename=\"$filename\"");

// output starts here, do not add headers from this point on.
$csv_file = fopen('php://output', 'w');

$csv_header = array(
    'column-1',
    'column-2',
    'column-3',
);

fputcsv($csv_file, $csv_header);

$data = array(
    array('a1', 'b1', 'c1'),
    array('a2', 'b2', 'c2'),
    array('a3', 'b3', 'c3'),
);

foreach ($data as $csv_data_entry) {
    fputcsv($csv_file, $csv_data_entry);
}

fclose($csv_file);

// With a non-file request, you would usually return the result.
// In this case, this would cause the "Headers already sent" errors, so an exit is required.
exit;