Загрузить файл с html и заархивировать или разархивировать файл с паролем в PHP?

Я не могу понять, как заархивировать файл в PHP с паролем. Паролем будет время и имя файла.

Это то, что я сделал до сих пор.

HTML-код для загрузки.

<form enctype="multipart/form-data" action="http://localhost/CSS/addfile.php" method="POST">
<div id="label">
<label>Upload File</label>
</div>
    <input name="doc" type="file" placeholder="Upload File Here" accept="files/topsecret/*" required>
<input type="submit" value="Upload" name="submit">
</form>

PHP-код

function GetImageExtension($filetype)
{
    if(empty($filetype)) return false;
    switch($filetype)
    {
        case 'files/topsecret/bmp': return '.bmp';
        case 'files/topsecret/gif': return '.gif';
        case 'files/topsecret/jpeg': return '.jpg';
        case 'files/topsecret/png': return '.png';
        case 'files/topsecret/txt': return '.txt';
        case 'files/topsecret/doc': return '.doc';
        case 'files/topsecret/docx': return '.docx';
        case 'files/topsecret/pdf': return '.pdf';
        default: return false;
    }
}

$upFile = $_FILES['doc']['name'];
$tmp_name = $_FILES['doc']['tmp_name'];
$ftype = $_FILES['doc']['type'];
$fileExt = GetImageExtension($ftype);

$filename = $upFile.$fileExt;
$target_path="files/topsecret/".$filename;
move_uploaded_file($tmp_name,$target_path);

date_default_timezone_set('Asia/Kuala_Lumpur');
$timefile = date("F j, Y g:ia");
$size = filesize($target_path);
$size = number_format($size / 1024, 2) . ' KB'; 

try{
    $sql = "INSERT INTO file(File_path,Date,Size,Name) VALUES ('".$target_path."','".$timefile."','".$size."','".$filename."')";

    if ($connection->query($sql)){

        echo"<script type= 'text/javascript'>alert('Upload Successfully');</script>";
        header("refresh:2;index.php");
    }else{
        echo "<script type= 'text/javascript'>alert('Upload Not Successfully Inserted.');</script>";
    }

Я исследовал несколько функций для php, но не знаю, как их использовать. как. ZipArchive::setEncryptionName ... но не могу его использовать, так как я использую PHP версии 7.1.8 в xampp.

Пожалуйста, помогите мне объяснить, как это сделать, как можно проще. Мне нужно зашифровать загруженный файл паролем, используя zip или rar. Планируйте использовать хэш имени файла и времени вместе, а затем установить его в качестве пароля.

Большое спасибо.


person Ivan Sim    schedule 25.10.2017    source источник
comment
Вы используете его именно так, как показано в примере php.net/manual/en/ziparchive. setencryptionname.php   -  person Stark    schedule 25.10.2017
comment
Я попробовал, но не могу использовать, так как моя версия 7.1.8, потому что я использую xampp. Неперехваченная ошибка: вызов неопределенного метода ZipArchive::setEncryptionName()   -  person Ivan Sim    schedule 25.10.2017


Ответы (1)


Во-первых, блоку try нужен catch.

Во-вторых, вам не нужна функция GetImageExtension, $_FILES имеет расширение в загруженном массиве, все, что вам нужно было сделать, это print_r($_FILES); проверить.

К сожалению, из того, что я прочитал, вы пока не можете зашифровать файл, вам нужно дождаться php 7.2 для использования $zip->setEncryptionName;.

Я понял это после того, как написал немного кода, тем не менее, я подумал, что это может быть полезно, поэтому я публикую этот ответ.

Вы можете посмотреть: http://php.net/manual/en/filters.encryption.php, это хороший вариант для интеграции в приведенный ниже код, у меня сейчас нет времени, но это довольно легко сделать, следуя их примерам.

if(isset($_POST['submit'])){
    upload($_FILES);
}

class Connection {
    protected $db = null;

    public function db(){
        if($this->db === null){
            try {
                $this->db = new PDO('mysql:host=localhost;dbname=name; charset=utf8', user, password);
            } catch (PDOException $e) {
                echo 'Connection failed: ' . $e->getMessage();
            }
        }
        return $this->db;
    }
}

function upload($file_data){

    // calling this statically, don't suggest it
    $conn = Connetion::db();

    $name = $file_data['doc']['name'];
    $tmp_name = $file_data['doc']['tmp_name'];
    $extension = explode('/', $file_data['doc']['type']); // $extension[1] returns file type.
    $image_size = getimagesize($tmp_name);

    $file_name = $name . '.' . $extension[1];
    $target_path = "";

    if($image_size !== false){

        $zip = new ZipArchive();
        if ($zip->open('uploaded_file.zip', ZipArchive::CREATE) === TRUE) {
            $zip->addFromString("text.txt", "#1 This is a test string added as testfilephp.txt.\n");
            $zip->setEncryptionName('text.txt', ZipArchive::EM_AES_256, 'secret'); // here we'd set the password 
            $zip->close();
            $zip_created = true;
        } else {
            $zip_created = false;
        }   

        // if zip was created and uploaded the file, then we upload it to the database
        if($zip_created == true){
            $sth = $conn->prepare('INSERT INTO file (file_path, `date`, size, name) VALUES (:target_path, :time_file, :size, :file_name)');
            $sth->bindValue(':target_path', $target_path, PDO::PARAM_STR);
            $sth->bindValue(':time_file', date('m-d-Y H:i:s'), PDO::PARAM_STR);
            $sth->bindValue(':target_path', $target_path, PDO::PARAM_STR);
            $sth->bindValue(':file_name', $file_name, PDO::PARAM_STR);
            $sth->execute();
        } else  {
            // here we can upload the error to the database or do nothing
        }
    }
}

?>

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="doc">
    <input type="submit" value="Upload" name="submit">
</form>
person Stark    schedule 25.10.2017