使用php将文件转换为二进制代码并保存在数据库中

mwngjboj  于 2022-11-28  发布在  PHP
关注(0)|答案(2)|浏览(257)

我创建的东西像谷歌驱动器或一些云使用PHP和HTML,你可以保存你的文件,但我有问题保存文件到二进制代码并上传到数据库.我的意思是我想这样做:
用户通过html格式上传文件-〉将文件转换为二进制-〉将其保存在数据库中。用户可以通过一些按钮或smh下载他的文件-〉文件从二进制转换为文件。
我试着做一个脚本什么将保存bin代码在我的数据库中,但当我试图发送一些文件,我得到这样的错误:

Fatal error: Uncaught TypeError: fopen(): Argument #1 ($filename) must be of type string, array given in C:\xampp\htdocs\fileshub\src\send_file.php:12 Stack trace: #0 C:\xampp\htdocs\fileshub\src\send_file.php(12): fopen(Array, 'rb') #1 {main} thrown in C:\xampp\htdocs\fileshub\src\send_file.php on line 12

这是我在html中的表单:

<form class="upload-form" action="./src/send_file.php" method="post" enctype="multipart/form-data"><br>
    <input type="text" name="filename" id="filename" placeholder="File name">
    <input type="file" name="file" id="file"><br>
    <button type="sumbit" class="submit">Submit</button>
</form>

这是我在php中编写的脚本:

<?php
session_start();
include "../src/db_conn.php";

if(isset($_SESSION['id'])) {
    
  $id = $_SESSION['id']; // id usera
  $filename = $_POST['filename']; // nazwa pliku

  $file = $_FILES['file'];

  $data = fopen ($file, 'rb');
  $size = filesize ($file);
  $contents = fread ($data, $size);
  fclose ($data);

  $binfile = base64_encode($contents);

  if(!$filename|| !$file) {
    header("Location: ../index.php?error=Enter your data!");
    exit();
  } else {
    $check = "SELECT bin_code FROM files WHERE user_id = '$id' AND bin_code = '$binfile' AND file_name = '$filename'";
    $result = mysqli_query($conn, $check);

    if(mysqli_num_rows($result) === 1){
      header("Location: ../index.php?error=Your file exsist.");
      exit();
    }else {
      $save = "INSERT INTO files (user_id, file_name, bin_code) values('$id', '$filename', $binfile)";
      $saveresult = mysqli_query($conn, $save);
      $saveresult;
      header("Location: ../index.php?error=Your file has been saved");
      exit();
    }
  }
}
?>

数据库连接:

<?php 
    $server = "localhost";
    $user ="root";
    $password = "";
    $db = "fileshub";

    $conn = mysqli_connect($server, $user, $password, $db);
?>

如果你知道我的问题的任何解决方案,请帮助:)
Files tableUsers table and example user显示器

xqkwcwgp

xqkwcwgp1#

我相信你知道,上传一个图像到一个目录是一个更有效的方式来存储它。
请注意,$_FILES ['file']是一个array,包含了上传文件的所有信息,对于您的情况,您必须使用上传文件的filename。(即“tmp_name”)
所以改变

$file = $_FILES['file'];
 $data = fopen ($file, 'rb');

$file = $_FILES['file']["tmp_name"];
 $data = fopen ($file, 'rb');

另一方面,另一种方法是使用file_get_contents代替fopen、fread等。

$contents = file_get_contents($_FILES['file']["tmp_name"]);
z3yyvxxp

z3yyvxxp2#

所以首先你需要确保你有一个PHP可以访问的目录,并且有权限访问,但是不能公开访问.通常,在web主机上web根文件夹是home目录的一个子文件夹,所以你可以在那里创建一个新的文件夹来存储文件.例如:

/home/myuser/public_html/ <-- might be the web root (some installations differ eg: htdocs or html or httpdocs)
/home/myuser/files/ <-- Create this folder for storing files.

或者,如果您的Web服务器是Apache,则可以在Web根目录中创建一个文件夹,并使用.htaccess文件保护该文件夹
在文件服务器上存储上传文件的最简单方法是使用PHP提供的move_uploaded_file命令,下面是我将如何实现这一点:

$postname = 'file';
$root = '/home/myuser/files';

//cleanse the filename to prevent SQL injections when saving to DB
$filename = preg_replace("/[^a-zA-Z0-9\.]/","_",$_FILES[$postname]['name']);

$path = "$root/$filename";

//Create the files folder if it doesnt already exist...
if(!file_exists($root)) if(!mkdir($root,0775,true)) die("Failed to create root folder $root");

//Store the uploaded file in the files folder
if(!move_uploaded_file($_FILES[$postname]['tmp_name'],$path)) die('Failed to move uploaded file into asset storage');

//Store the file location in the database...
$saveresult = mysqli_query($conn,"INSERT INTO `files` (`filename`,`path`) VALUES ('$filename','$path')");

相关问题