压缩多个文件,其地址存储在mysql表中

时间:2016-12-21 05:49:40

标签: php mysql zip compression multiple-files

我的服务器中存储了多个文件,可以使用userid及其地址在我的表中找到它们。

他们有不同的文件类型,如docx和jpeg以及pdf。

我有一个jquery post方法,它将user_id发送到正确的php文件,在其中我将运行我的查询以将用户文件地址作为数组。

$("#download_btn").click(function () {
                var uni_id = $("#uni_selection_filter").val();

                $.post("Requests/zipCorsponds.php", //Required URL of the page on server
                    {   // Data Sending With Request To Server
                        Get_arch_letters : true,
                        user_id : vuser_id,
                        user_role : "<?php echo $_SESSION["role"]; ?>",
                        section_num : "<?php echo $_SESSION['section_id'] ?>",
                        uni_id : uni_id
                    },
                    function(response){  // Required Callback Function
                            $("#dynamic_table").html(response);
                    });

            });

现在我在查询之后添加了下面的方法来压缩这些文件并将结果发送到jquery,用户可以下载所有他/她的文件。

   if ($_POST['Get_arch_letters']) {
    $user_id = $_POST['user_id'];
    $user_role = $_POST['user_role'];
    $section_num = $_POST['section_num'];
    $uni_id = $_POST['uni_id'];

        if ($user_role == 'executive_manager') {
            $load_corspnd_letter = $DBM->RunQuery("SELECT at_corspond_file.corspond_file FROM at_corspnd 
                                                INNER JOIN at_corspond_file ON (at_corspnd.id = at_corspond_file.corspond_id)
                                                WHERE at_corspnd.uni_id = '$uni_id' ", true, false);
        }

        $files = mysqli_fetch_assoc($load_corspnd_letter);

        # create new zip opbject
        $zip = new ZipArchive();

        # create a temp file & open it
        $tmp_file = 'Resume.zip';
        $zip->open($tmp_file, ZipArchive::CREATE);

         # loop through each file
         foreach($files as $file){

             if (!file_exists('../'.$file)) { die($file.' does not exist'); }

             if (!is_readable('../'.$file)) { die($file.' not readable'); }

              # download file
              $download_file = file_get_contents('../'.$file);

              #add it to the zip
              $zip->addFile(basename($file),$download_file);
        }

        # close zip
        $zip->close();


        echo 'Requests/'.$tmp_file;


    }

但我得到的结果是:PK|H�IPK|H�I��PK.

我该如何做到这一点?

更新

我添加了检查存档文件是否已创建的条件,它通过了这个条件,但我的目录中没有文件:

   # create new zip opbject
    $zip = new ZipArchive();

    # create a temp file & open it
    $tmp_file = 'Resume.zip';
    if($zip->open($tmp_file, \ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true)
        echo 'cannot create zip';

    # loop through each file
    foreach($files as $file){

        if (!file_exists('../'.$file)) {
            continue;
        }

        if (!is_readable('../'.$file)) { die($file.' not readable'); }

        #add it to the zip
        $zip->addFile(basename($file));
    }

    # close zip
    $zip->close();


    echo 'Requests/'.$tmp_file;

1 个答案:

答案 0 :(得分:2)

您无法使用自己的方法下载文件。现在,您的代码会尝试显示您对服务器的调用结果。 您有2个选项可以完成这项工作。

<强> 1。使用您当前的PHP代码

如果直接在浏览器中调用,PHP代码将起作用。您可以使用'#download_btn'提交具有正确输入值的表单

<强> HTML

<form action="Requests/zipCorsponds.php" method="post" id="frm">
<input type="hidden" name="Get_arch_letters" value="true" />
<input type="hidden" name="user_role" value="<?php echo $_SESSION["role"]; ?>" />
...
<input type="hidden" name="uni_id" id="uni_id" value="" />
</form>

<强> jquery的

$("#download_btn").click(function () {
   var uni_id = $("#uni_selection_filter").val();
   $("#uni_id").val(uni_id);
   $("#frm").submit();
});

<强> 2。使用您当前的jquery post方法

您需要更改回调函数以下载返回的文件。

<强> jquery的

...
function(response){  // Required Callback Function
   window.location = response;
});
...

并更改php代码以返回文件路径而不是文件本身。您还需要使用正确的扩展名正确命名文件。

<强> PHP

...
# create a file & open it
$tmp_file = 'Resumes.zip';
$zip->open($tmp_file, ZipArchive::CREATE | ZipArchive::OVERWRITE);

# loop through each file
     foreach($files as $file){

         if (!file_exists('../'.$file)) { die($file.' does not exist'); }

         if (!is_readable('../'.$file)) { die($file.' not readable'); }

          #add file to the zip
          $zip->addFile(basename('../'.$file));
    }
# close zip
$zip->close();

# send the file to the post request
echo 'Requests/'.$tmp_file;