Zend Framework 3:为生成的文件创建下载 link

Zend Framework 3: create download link for generated file

我正在编写一个允许用户上传 Excel 文件的应用程序。它检查文件是否有错误,然后,如果没有发现错误,它会将内容上传到数据库。如果确实发现错误,则包含错误的单元格会显示为红色,然后保存文件。然后我想创建一个下载 link 到这个文件,这样用户就可以检查他们在哪里犯了错误。 问题是我不确定如何创建此 link 以及将文件存储在何处。我这样修改文件:

foreach ($badCells as $bcell) {
                $sheet->getStyle($bcell)->applyFromArray(array(
                    'fill' => array(
                        'type' => \PHPExcel_Style_Fill::FILL_SOLID,
                        'color' => array('rgb' => 'FF4444')
                    )
                ));
            }

然后用

保存
$objWriter->save($dldir . $formData['upload']['name']);

$dldir 是用

创建的
$dldir = "/download/";
        if (file_exists($dldir)) {
            if (!is_dir($dldir)) {
                unlink($dldir);
                mkdir($dldir);
            }
        } else {
            if(!is_dir($dldir)) {
                mkdir($dldir);
            }
        }

这是正确的方法吗?我可以将文件存储在任何旧文件夹中,还是它们已转到特定位置?如何在视图中为用户创建特定文件的 link 并使其可访问以便他们可以下载?

我可能错了。

对于文件上传,我使用这个库Gargron/fileupload 下面的函数有助于将文件上传到特定文件夹和 return 完整 link 文件。您可以将 link 保存在 DB

    function uploadFile ($file){
        $validator = new \FileUpload\Validator\Simple('5M');

        $pathresolver = new \FileUpload\PathResolver\Simple($_SERVER['DOCUMENT_ROOT'].'/upload_folder');

        $filesystem = new \FileUpload\FileSystem\Simple();

        $fileupload = new \FileUpload\FileUpload(file, $_SERVER);

        $fileupload->setPathResolver($pathresolver);
        $fileupload->setFileSystem($filesystem);
        $fileupload->addValidator($validator);
        $md5Generator = new \FileUpload\FileNameGenerator\MD5 (true);
        $fileupload->setFileNameGenerator($md5Generator);

        list($files) = $fileupload->processAll();

        foreach($files as $file){
            if ($file->completed) {
               return $_SERVER['DOCUMENT_ROOT'].'/upload_folder/'.$file->getFileName()) ;
            }
        }
       }

感谢您的帮助,我设法在周末解决了这个问题。这是我的做法 它:

$filename = join(DIRECTORY_SEPARATOR, array($dldir, $formData['upload']['name']));
$objWriter->save(str_replace(__FILE__,$filename,__FILE__));

这就是我使用 DIRECTORY_SEPARATOR 保存文件的方式,因此它可以在 Windows 和 Linux 上正常工作。

 return $this->redirect()->toRoute('import', ['action' => 'reject'],['query' => ['q' => 'file', 'name' => $filename]]);

在控制器中,我将路由重定向到正确的操作并通过查询将文件名传递给它 URL。

public function rejectAction()
{
    $filename = $this->getRequest()->getQuery('name', null);
    return new ViewModel(array('filename' => $filename));
}

在那里,我通过 getRequest()->getQuery() 获取所述文件名并将其传递给视图模型。

<a href="<?php echo $this->filename; ?>">Right-click here and choose 'Save As' to download your file.</a>

最后,这是它在 reject.phtml 中显示 link 的方式。 下载仅适用于右键单击并另存为,我怀疑我必须编写某种文件处理程序才能使 ZF 为正常的左键单击下载生成正确的 headers。