ファイルアップロードし、mysqlに保存

mysqlのmax_allowed_memoryが1Mだったので、mysqliのprepareメソッドでファイルデータを分割してSQLを送信するようにした。

1.ファイルをアップロード
2.アップロードからファイル名などを取り出す。
3.mysqlに接続
4.mysqlにinsert

1.ファイルをアップロード
<form enctype=”multipart/form-data” action=”fileup.php” method=”POST”>
    このファイルをアップロード: <input name=”userfile” type=”file” />
    <input type=”submit” value=”ファイルを送信” />
</form>

2.アップロードからファイル名などを取り出す。
$tmp_name = $_FILES[“userfile”][“tmp_name”];
$size = $_FILES[“userfile”][“size”];
$file_name = $_FILES[‘userfile’][‘name’];
$file_type = $_FILES[‘userfile’][‘type’];

$fp = fopen($_FILES[“userfile”][“tmp_name”], “rb”);
  if(!$fp)
  {
   print(“アップロードしたファイルを開けませんでした”);
   exit;
  }
  $file_data = addslashes(fread($fp, filesize($_FILES[“userfile”][“tmp_name”])));
  fclose($fp);

3.mysqlに接続
$host = ‘localhost’;
$user = ‘ユーザー名’;
$password = ‘パスワード;
$database = ‘データベース名’;

$db = new mysqli($host, $user, $password, $database);

//文字化け対策
$stmt = $db->prepare(“SET NAMES utf8”);
$stmt->execute();

4.mysqlにinsert
$sql = “insert into FILE (file_name,file_type,file_data,up_date) values (‘$file_name’,’$file_type’,?,’$up_date’)”;
$stmt = mysqli_prepare($db,$sql);

$null = NULL;
//blob型のデータをバインドする。
$stmt->bind_param(“b”, $null);

ファイルからデータを8192バイトずつ取り出し、send_long_dataで送る
$fp = fopen($_FILES[“userfile”][“tmp_name”], “rb”);
while (!feof($fp)) {
    $stmt->send_long_data(0, fread($fp, 8192));
}
fclose($fp);

$rs = $stmt->execute();

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です