【问题标题】:File response from zip来自 zip 的文件响应
【发布时间】:2014-08-03 15:40:00
【问题描述】:

这就是我想要做的:我已经使用 ZipArchive 类创建了 zip 存档,其中包含多个文件,我现在需要做的是,打开存档,读取单个文件并下载或在浏览器中打开它。

由于我使用的是 symfony2 框架,如果它是一个常规文件,我可以这样做:

case 'open':
    $response = new BinaryFileResponse($filepath);
    $response->headers->set('Content-type', mime_content_type($filepath));
    $response->setContentDisposition(
        ResponseHeaderBag::DISPOSITION_INLINE,
        $filename
    );
    return $response;
case 'save':
    $response = new BinaryFileResponse($filepath);
    $response->headers->set('Content-type', mime_content_type($filepath));
    $response->setContentDisposition(
        ResponseHeaderBag::DISPOSITION_ATTACHMENT,
        $filename
    );
    return $response;

但由于文件不在任何目录中,我可以将其传递给 BinaryFileResponse 类,因为它只接受文件或 SplFileInfo 对象的字符串路径,而不接受文件内容。

我发现以下post 让我想到从文件内容创建 SplFileObject,然后将其作为 SplFileInfo 对象传递给 BinaryFileResponse 类,因为 SplFileObject 扩展了 SplFileInfo,所以这就是我所做的:

$tmp = 'php://temp';
$file = new \SplFileObject($tmp, 'w+');
$file->fwrite($filecontents);

然后将 $file 传递给 BinaryFileResponse 类,但它会抛出错误:文件“php://temp”不存在。我不知道我是否在做这样的事情的正确方式,如果是这样,我错过了什么。

无论如何,我不希望以两种不同的方式从存档中提供文件:1. 下载,2. 在浏览器中打开。

PS。这些文件是PDF格式。如果我创建响应对象并将其内容设置为存档文件的内容,我可以打开它们,但是我无法直接下载。

抱歉,如果造成混淆,提前感谢您的帮助。

【问题讨论】:

    标签: php file zip response


    【解决方案1】:

    我最终想到了什么:

    //1. Extract file to chosen directory
    $zip = new \ZipArchive();
    if ($zip->open('file/path/file.zip') {
        $zip->extractTo('chosen/directory', array('filename_in_zip_archive.ext'));
        $zip->close();
    }
    
    //2. Put file in response
    $response = new Response(file_get_contents('chosen/directory/filename_in_zip_archive.ext'));
    $mime = new \finfo(FILEINFO_MIME_TYPE);
    $response->headers->set('Content-type', $mime->file('chosen/directory/filename_in_zip_archive.ext'));
    
    //3. logic to open or download file
    case 'open':
        $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_INLINE, 'filename_in_zip_archive.ext');
    case 'save': 
        $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'filename_in_zip_archive.ext');
    
    
    //4. After file has been put to response, delete local file copy
    if (file_exists('chosen/directory/filename_in_zip_archive.ext')) {
        unlink('chosen/directory/filename_in_zip_archive.ext');
    }
    
    //5. Return response with file
    return $response;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 2021-12-05
      • 2013-09-23
      • 2021-05-18
      • 2011-01-04
      • 2019-02-05
      • 1970-01-01
      相关资源
      最近更新 更多