通过标头发送的文件不起作用

时间:2016-09-13 14:02:54

标签: php laravel http-headers file-transfer

我使用Laravel获取文件并发回给用户进行自动下载。这是我的代码:

public function postGetFile() {
    $inputData = $this->request->json()->all();

    try {
        $file = $this->processor->postGetFile($inputData);

        // Feed the file to web browser.
        header('Content-Description: File Transfer');
        header('Content-Type: '.mime_content_type($file));
        header('Content-Disposition: attachment; filename="'.basename($file).'"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Access-Control-Allow-Origin: *');

        if (ob_get_length()) {
            ob_end_clean();
        }

        flush();
        readfile($file);
        exit;

        return $this->response->success()->withData($file);
    } catch (ResponseException $e) {
        return $this->response->fail()->withException($e);
    }
}

我的问题是我得到了正确的文件,但不知何故文件被更改了。下载文件的文件大小与服务器上的原始文件不同,因此传输中的文件很明显。任何人都可以看到这里可能出现的问题吗?

修改

由于评论中的建议,尝试了以下内容:

public function postGetFile() {
    $inputData = $this->request->json()->all();

    try {
        $file = $this->processor->postGetFile($inputData);

        $headers = array(
            'Content-Type: '.mime_content_type($file),
            'Access-Control-Allow-Origin: *'
        );

        // Tried both of the following, none worked.
        return response()->download($file, basename($file), $headers);
        return $this->response->download($file, basename($file), $headers);
    } catch (ResponseException $e) {
        return $this->response->fail()->withException($e);
    }
}

我得到的只是控制台中出现以下错误:XMLHttpRequest cannot load http://docker//admin/files/getfile. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9900' is therefore not allowed access. The response had HTTP status code 500.

“网络”标签不提供任何数据。只有"无法加载响应数据"。

1 个答案:

答案 0 :(得分:1)

您可以使用Laravel Http Response:

return response()->download($pathToFile);

return response()->download($pathToFile, $name, $headers);

您可以阅读更多here