创建多个文件的zip文件并在laravel中下载

时间:2018-08-16 08:49:29

标签: laravel

我正在使用以下代码制作zip并允许用户下载zip

但它不起作用。它显示为ZipArchive :: close()错误:读取错误:文件描述符错误。可能是问题所在?我正在使用laravel。

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.LinkedList;
import javax.swing.JFrame;

public class LineDrawing extends Canvas {

    int x1 = 5;
    int y1 = 10;
    int x2 = 105;
    int y2 = 100;
    double m = ((double) (y2 - y1)) / ((double) (x2 - x1));//slope
    double b = y1 - (m * ((double) x1));//vertical shift

    //Takes care of the domain we will loop between.
    //min and max will be assigned minX and maxX if the line is not vertical.
    //minY and maxY are assigned to min and max otherwise.
    int minX = Math.min(x1, x2);//minimum x value we should consider
    int maxX = Math.max(x1, x2);//maximum x value we should consider
    int minY = Math.min(y1, y2);//minimum y value we should consider
    int maxY = Math.max(y1, y2);//maximum y value we should consider
    int min = 0;
    int max = 0;
    boolean plugX = true;//if true, the line is not vertical.
    LinkedList<Point> points = new LinkedList<>();//Store all points here

    public LineDrawing() {

        if (x1 == x2) {//plug the y value instead the x, this is a vertical line.
            plugX = false;
            min = minY;
            max = maxY;
        } else {//dont change and plug x values.
            min = minX;
            max = maxX;
        }
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);

        //Draw the line, using default java drawLine in blue.
        g.setColor(Color.BLUE);
        g.drawLine(x1, y1, x2, y2);

        //change the color to red, it will draw our verison.
        g.setColor(Color.RED);

        //Draw the points, point by point on screen.
        //Plug m, x, and b in the formula y = m*x + b
        //to obtain the y value.
        //OR
        //Plug m, y, and b in the formula x = (y - b) / m
        //to obtain the x value if vertical line.
        //Then plot (x,y) coordinate on screen and add the point to our linkedList.
        for (int i = min; i <= max; i++) {
            int obtained = 0;
            if (plugX) {//not a vertical line
                obtained = (int) Math.round((m * i + b));
                System.out.println("x = " + i + "  ,  y = " + obtained);
                points.add(new Point(i, obtained));
                //Uncomment to see the full blue line.
                g.drawLine(i, obtained, i, obtained);
            } else {//vertical line
                obtained = (int) Math.round((double) (i - b) / (double) m);
                System.out.println("x = " + x1 + "  ,  y = " + i);
                g.drawLine(x1, i, x1, i);//Uncomment to see the full blue line.
                points.add(new Point(x1, i));
            }
        }

        //Print out the number of points as well as the coordinates themselves.
        System.out.println("Total points: " + points.size());
        for (int i = 0; i < points.size(); i++) {
            System.out.println(i + "      ( " + points.get(i).x
                + ", " + points.get(i).y + " )");
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(120, 150);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new LineDrawing());
        frame.setVisible(true);
    }
}

4 个答案:

答案 0 :(得分:2)

我建议您使用Zipper软件包

尝试下面的代码来创建多个文件的zip:

public function downloadZip($id)
    {
        $headers = ["Content-Type"=>"application/zip"];
        $fileName = $id.".zip"; // name of zip
        Zipper::make(public_path('/documents/'.$id.'.zip')) //file path for zip file
                ->add(public_path()."/documents/".$id.'/')->close(); //files to be zipped

        return response()
        ->download(public_path('/documents/'.$fileName),$fileName, $headers);
    }

答案 1 :(得分:2)

仅纯PHP代码。

public function makeZipWithFiles(string $zipPathAndName, array $filesAndPaths): void
{
    $zip = new ZipArchive();
    $tempFile = tmpfile();
    $tempFileUri = stream_get_meta_data($tempFile)['uri'];
    if ($zip->open($tempFileUri, ZipArchive::CREATE) === TRUE) {
        // Add File in ZipArchive
        foreach($filesAndPaths as $file)
        {
            if (! $zip->addFile($file, basename($file))) {
                echo 'Could not add file to ZIP: ' . $file;
            }
        }
        // Close ZipArchive
        $zip->close();
    } else {
        echo 'Could not open ZIP file.';
    }
    echo 'Path:' . $zipPathAndName;
    rename($tempFileUri, $zipPathAndName);
}

答案 2 :(得分:1)

对于Laravel 7.29.3 PHP 7.4.11

api.php

中创建GET路由
Route::get('/downloadZip','ZipController@download')->name('download');

创建控制器ZipController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use File;

class ZipController extends Controller
{
    public function download(Request $request)
    {
        $zip = new \ZipArchive();
        $fileName = 'zipFile.zip';
        if ($zip->open(public_path($fileName), \ZipArchive::CREATE)== TRUE)
        {
            $files = File::files(public_path('myFiles'));
            foreach ($files as $key => $value){
                $relativeName = basename($value);
                $zip->addFile($value, $relativeName);
            }
            $zip->close();
        }

        return response()->download(public_path($fileName));
    }
}

public文件夹中,确保您有一个文件夹myFiles。此代码段将获取文件夹中的每个文件,创建一个新的zip文件,并将其放入public文件夹中,然后在调用route时,它将返回创建的zip文件。

答案 3 :(得分:0)

您可以使用以下代码

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\ImgUpload;
use ZipArchive;
use File;
class UserController extends Controller
{

/**
 * Function to get all images from DB
 */
public function downloadZip()
{
  $data = ImgUpload::all();
  foreach($data as $key => $value)
  {
    $imgarr[] = "storage/image". '/' . $value->image;
  }

  $ziplink = $this->converToZip($imgarr);
  return $ziplink;


}
/**
 * Function to covert all DB files to Zip
 */
public function converToZip($imgarr)
{
            $zip = new ZipArchive;
            $storage_path = 'storage/image';
            $timeName = time();
            $zipFileName = $storage_path . '/' . $timeName . '.zip';
            $zipPath = asset($zipFileName);
            if ($zip->open(($zipFileName), ZipArchive::CREATE) === true) {
                foreach ($imgarr as $relativName) {
                    $zip->addFile($relativName,"/".$timeName."/".basename($relativName));
                }
                $zip->close();

                if ($zip->open($zipFileName) === true) {
                    return $zipPath;
                } else {
                    return false;
                }
            }
}

}

您可以参考this link了解更多信息