検索プログラマのメモ帳

壁にぶつかったら検索で調べるプログラマのちょっと遅れたメモ帳。たまに自分で挑戦する。

Skip to: Content | Sidebar | Footer

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

8 7月, 2009 (13:39) | セキュリティー(PHP) | By: admin

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();

Write a comment