私自身の小さなプロジェクトでは、php/mysqlを使ってファイルをアップロードしてダウンロードする必要があります。phpとmysqlでアップロードされたファイルが壊れています
ファイルは次のようにPOSTを使用してフォームを介してアップロードして処理されます。
<?
$passName1 = $_FILES['passport1']['name'];
$tmpName1 = $_FILES['passport1']['tmp_name'];
$fileSize1 = $_FILES['passport1']['size'];
$fileType1 = $_FILES['passport1']['type'];
$fp1 = fopen($tmpName1, 'r');
$pass_1_content = fread($fp1, filesize($tmpName1));
fclose($fp1);
?>
は、その後、私はこの機能を使用してそれらをアップロードします。
$passport1id = insert_user_file ($db, $passName1, $fileType1, $fileSize1, $pass_1_content);
function insert_user_file ($db, $name, $type, $size, $content) {
try {
echo "<br>start insert file $name";
$insertfile = new PDO("mysql:host=".$db['server'].";dbname=".$db['db'], $db['mysql_login'], $db['mysql_pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
// set the PDO error mode to exception
$insertfile->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters
$stmt=$insertfile->prepare ("INSERT INTO files (name, size, type, content, created) VALUES (:name, :size, :type, :content, NOW())");
$stmt->bindParam(":name", $name);
$stmt->bindParam(":size", $size);
$stmt->bindParam(":type", $type);
$stmt->bindParam(":content", $content);
$stmt->execute();
$file_id = $insertfile->lastInsertId();
return $file_id;
}
catch(PDOException $e) {
echo 'error: '. $e->getMessage();
return false;
}
}
名までにaddslashes()の存在/ファイルの内容はまったく違いはありません。
get_file ($db, $_GET['id']);
function get_file ($db, $fileid){
try {
$get_file = new PDO("mysql:host=".$db['server'].";dbname=".$db['db'], $db['mysql_login'], $db['mysql_pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
$get_file->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$file = $get_file->prepare("SELECT * FROM files where fileid=:fileid");
$file->bindParam(":fileid", $fileid);
$file->execute();
$file_data = $file->fetch(PDO::FETCH_ASSOC);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header("Content-length: {$file_data['size']}");
header("Content-type: {$file_data['type']}");
header("Content-Disposition: attachment; filename={$file_data['name']}");
echo $file_data['content'];
exit;
}
catch(PDOException $e) {
//echo 'error: '. $e->getMessage();
return false;
}
}
'addslashes()'はまったく役に立たない。あなたはプレースホルダーで準備されたステートメントを使用しています。 DBは、(内部的に)データを安全に保つために必要なエスケープを行います。あなたがやっているのは基本的にDOUBLEエンコーディングなので、元のデータには存在しないバックスラッシュを追加しているので、データは破損しています。 –
'$ pass_1_content = addslashes($ pass_1_content);'あなたは自分ですべてを破損しました – RiggsFolly
そして、あなたが読んでいるファイルが "大"の場合、メモリ不足のエラーでスクリプトを強制終了する危険があります。 PHPは「値渡し」を使用しています.db関数の場合は外部のファイルを読み込み、それを関数に渡すと、そのファイルの2つのコピーがメモリ内に存在するため、RAM要件が倍増します。 –