0
if(isset($_POST['submit'])){
if(!empty($_FILES['files']['name'])){
  $Zip = new ZipArchive();
  $Zip->open('uploads.zip', ZIPARCHIVE::CREATE);
  $UploadFolder = "uploads/";
  foreach($_FILES['files'] as $file){
        $Zip->addFile($UploadFolder.$file);
  }
  $Zip->close();
}
 else {
     echo "no files selected";
}
}

ここで何が問題なのですか? アーカイブを作成してそこにファイルを追加するチュートリアルを見たところですが、機能していません...私は php 5.4 を使用しています。エラーが発生することさえありません。ここで私が間違っていることを教えてください。

以下はフォームです

<form action="" method="POST" enctype="multipart/form-data">
            <label>Select files to upload</label>
            <input type="file" name="files">
            <input type="submit" name="submit" value="Add to archieve">
        </form>
4

1 に答える 1

1

これらの行は意味をなさない

$UploadFolder = "uploads/";
foreach($_FILES['files'] as $file){
    $Zip->addFile($UploadFolder.$file);
}

投稿したコードのその時点では、アップロードされたファイルはuploads/ディレクトリに移動されておらず、要素をループ処理しています。$_FILES["files"]これは、さまざまな値の連想配列であり、そのうちの 1 つだけが実際のファイル名です。ファイルとしての ZIP は無意味です。-ファイルのアップロードに関する PHP ドキュメントを読む必要があります。PHP がファイルのアップロードをどのように処理するのか、まだよくわかっていないことは明らかです。このようなことを試みる前に、そのことを知っておく必要があります。

1 つの解決策は、アップロードされたファイルを をuploads/使用してディレクトリに移動するmove_uploaded_fileことですが、実際にはそこにあるファイルを使用してアーカイブに追加するだけなので、その手順はかなり冗長です。一時的な場所から直接追加できます。ただし、最初にそれを確認する必要がありますが、これはis_uploaded_file関数で実行できます。

// Make sure the file is valid. (Security!)
if (is_uploaded_file($_FILES["files"]["tmp_name"])) {
    // Add the file to the archive directly from it's
    // temporary location. Pass the real name of the file
    // as the second param, or the temporary name will be
    // the one used inside the archive.
    $Zip->addFile($_FILES["files"]["tmp_name"], $_FILES["files"]["name"]);

    $Zip->close();

    // Remove the temporary file. Always a good move when
    // uploaded files are not moved to a new location.
    // Make sure this happens AFTER the archive is closed.
    unlink($_FILES["files"]["tmp_name"]);
}
于 2013-09-09T02:25:14.223 に答える