我正在尝试将文件发布到Blob。我创建了一个HTML表单,该表单会在选择A文件时自动发布:
<form id="target" method="post" name="frmImage" class="frmImageUpload" action="./post.php">
<div id="pic1">
<input type="file" name="userfile" id="userfile" class="userfile"/>
</div>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript">
$('#pic1').click(function(){
$('#userfile').trigger('click');
});
</script>
<script type="text/javascript">
$('#userfile').change(function() {
$('#target').submit();
});
</script>
当我选择文件时,脚本会将我导航到post.php
。但是它没有向数据库发布任何内容。
这是我的post.php:
<?php
include_once '../../../../includes/connect.php';
include_once '../../../../includes/functions.php';
sec_session_start();
$correct = true;
if(isset($_POST['userfile']) && $_FILES['userfile']['size'] > 0) {
$fileName = $_FILES['userfile']['name'];
$tmpName = $_FILES['userfile']['tmp_name'];
$fileSize = $_FILES['userfile']['size'];
$fileType = $_FILES['userfile']['type'];
$_SESSION['user_id'];
$fp = fopen($tmpName, 'rb');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
if(!get_magic_quotes_gpc())
{
$fileName = addslashes($fileName);
}
$query = "INSERT INTO temp (user_id, content) VALUES (". $_SESSION['user_id'] .", '$content')";
mysql_query($query) or die(mysql_error());
$msg = "<br>File <b>$fileName</b> uploaded<br>";
}
else
{
$msg = "<br>File <b>$fileName</b> not uploaded<br>";
}
?>
有人知道我的脚本出了什么问题吗?
编辑: 收到的错误消息如下:
注意:未定义的索引:第12行(...)中的用户文件
和
注意:未定义的变量:第37行(...)中的文件名
答案 0 :(得分:2)
根据您的评论,由于multipart/form-data
,您将收到未定义的索引通知,
您需要在<form>
中将enctype="multipart/form-data"
用作:
<form id="target" method="post" name="frmImage" class="frmImageUpload" action="./post.php" enctype="multipart/form-data">
第二,您需要在顶级声明中将$fileName
定义为$fileName = '';
,否则您将收到另一个未定义的变量通知
您需要在此行之前声明它:
if(isset($_POST['userfile']) && $_FILES['userfile']['size'] > 0) {
为:
$fileName = '';
if(isset($_POST['userfile']) && $_FILES['userfile']['size'] > 0) {
第三,不建议使用mysql_ *扩展名,并已在PHP7中关闭,我建议您使用mysqli_*
或PDO
。
第四,您的代码对于SQL注入是开放的,防止SQL注入,您可以使用PDO。
第五,不知道这是什么吗? $_SESSION['user_id'];
一些有用的链接:
How can I prevent SQL injection in PHP?
Are PDO prepared statements sufficient to prevent SQL injection?
答案 1 :(得分:2)
您的表单必须包含enctype='multipart/form-data'
属性。上传文件需要此属性。
它看起来像:
<form id="target" method="post" enctype='multipart/form-data' name="frmImage" class="frmImageUpload" action="./post.php">
<div id="pic1">
<input type="file" name="userfile" id="userfile" class="userfile"/>
</div>
</form>
我建议您使用move_uploaded_file
。 See more。