PHP rest api如何返回文件或下载

Posted

技术标签:

【中文标题】PHP rest api如何返回文件或下载【英文标题】:PHP rest api how to return a file or download 【发布时间】:2022-01-03 09:34:48 【问题描述】:

我有一个rest api,端点是getfilestart.php。它的作用是使用 PDO 在数据库中搜索文件名。如何获取文件并将其作为文件返回或使用邮递员或在浏览器中自动下载?我尝试了几种方法,但我无法获取文件。目录在../files/

这里是下载功能

    public function downloadFile($param)
        $base_url = $_SERVER['REQUEST_SCHEME']."://".$_SERVER['SERVER_NAME'];
     
        $q = "SELECT * FROM data_file WHERE module_id = ". $param;
        $stmt = $this->conn->prepare($q);
        $stmt->execute();

        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        $filename = $row['file_name'];
        $request_url = $base_url .'/mtc_project_server/files/'.$filename;
    

如果我转储 request_url 它的 http://localhost/mtc_project_server/files/mir4.PNG 这是实际文件。我如何使用休息下载它?我尝试做 cURL 和 file_get_contents 但仍然无法正常工作。提前致谢

【问题讨论】:

选项 1. 响应文件 URL(例如 - 作为 JSON .downloadURL 属性)并使用重定向到该 URL。选项 2. 使用 PHP readfile()header() 到 force download。 哦。所以对于选项1,你的意思是我会返回一个网址?我认为选项2更好,您能给我举个例子吗? @vee download use cURL 的示例。 试过卷曲,但我得到了filestart 文件名,@vee 大小为 0 字节。我用浏览器 强制下载代码已经在链接里了。 ***.com/questions/7263923/… 【参考方案1】:

来自您的下载文件 URL $request_url。 这是服务器端的强制下载源代码。

// https://***.com/questions/7263923/how-to-force-file-download-with-php

header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"" . basename($request_url) . ".jpg\""); 
readfile($request_url);
exit();// end process to prevent any problems.

这是在客户端下载的源代码。

$url = 'https://my-domain.tld/rest-api/path.php';// change this to your REST API URL.

// https://***.com/questions/6409462/downloading-a-large-file-using-curl

$fileext = pathinfo($url, PATHINFO_EXTENSION);
echo $fileext;
set_time_limit(0);
// For save data to temp file.
$fp = fopen (__DIR__ . '/localfile.tmp', 'w+');

//Here is the file we are downloading, replace spaces with %20
$ch = curl_init(str_replace(" ","%20",$url));
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
// write curl response to file
curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);

// get curl response
$response = curl_exec($ch); 

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

fwrite($fp, $body);

curl_close($ch);
fclose($fp);

// rename temp file.
preg_match('/filename=[\'"]?([\w\d\.\-_]+)[\'"]?/i', $header, $matches);
var_dump($matches);
if (isset($matches[1]) && !is_file(__DIR__ . '/' . $matches[1])) 
    // if target rename file is not exists.
    rename(__DIR__ . '/localfile.tmp', __DIR__ . '/' . $matches[1]);
 else 
    // for debug
    echo 'something wrong!<br>';
    var_dump($matches);
    echo '<br>';
    echo 'File was downloaded into ' . __DIR__ . '/localfile.tmp';
    exit();

【讨论】:

以上是关于PHP rest api如何返回文件或下载的主要内容,如果未能解决你的问题,请参考以下文章

使用 angularjs 从 PHP REST API 下载 docx 文件

通过Google Drive REST API上传或创建包含内容的新文件?

Nodejs:如何从 REST API 下载 pdf 文件?

如何使用v3 rest api从google驱动器下载文件?

如何下载Paypal rest api SDK jar

如何使用 ASP.NET MVC Rest API 调用和 jQuery Ajax 下载文件