我无法弄清楚如何使用密码在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 ...但不能使用它,因为我在xampp中使用PHP版本7.1.8。
请尽可能简单地帮我解释如何做到这一点。我需要使用zip或rar用密码加密上传的文件。计划使用散列文件名和时间,然后将其设置为密码。
非常感谢。
答案 0 :(得分: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>