上传的文件赢得';无法从表(PHP、MySQL)中打开(不正确的目录)
对不起,如果这是愚蠢的事情,但只是寻求一些真正的帮助。与此抗争 我有一个HTML脚本,它上载一个名为上传的文件赢得';无法从表(PHP、MySQL)中打开(不正确的目录),php,mysql,file-upload,hyperlink,Php,Mysql,File Upload,Hyperlink,对不起,如果这是愚蠢的事情,但只是寻求一些真正的帮助。与此抗争 我有一个HTML脚本,它上载一个名为minegem.HTML的文件,提交时调用minegem.php该脚本将表单中的数据上载到表中,将文件上载到目录,并为用户提供一个表以查看所述数据。这一切都很顺利 <?php //define variables to be used $db_host = 'localhost'; $db_user = 'root'; $db_pwd = ''; $database = 'minetec
minegem.HTML
的文件,提交时调用minegem.php
该脚本将表单中的数据上载到表中,将文件上载到目录,并为用户提供一个表以查看所述数据。这一切都很顺利
<?php
//define variables to be used
$db_host = 'localhost';
$db_user = 'root';
$db_pwd = '';
$database = 'minetech';
$table = 'minegem';
$directory = 'uploads/minegem/';
//This gets all the other information from the form
$name=$_POST['docname'];
$version=$_POST['docver'];
$date=$_POST['docdate'];
$type=$_POST['doctype'];
$author=$_POST['docauth'];
//target directory is assigned
$target = $directory;
$target = $target . basename( $_FILES['uploaded']['name']) ;
//if everything is ok upload the file
if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target))
{
echo "The file ". basename( $_FILES['uploaded']['name']). " has been uploaded";
}
else {
echo "Sorry, there was a problem uploading your file.";
}
//connect to sql
$con = mysql_connect("$db_host","$db_user","$db_pwd");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
//connect to database
mysql_select_db("$database", $con);
//insert data from form to database
$sql="INSERT INTO $table (DocName, DocVer, DocDate, DocType, DocAuth, DocLoc)
VALUES
('$name','$version','$date','$type','$author','$target')";
//confirm data entry
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo " and new record added. How cool is that.";
//the following script displays the data for test purposes
//this script will show table data
//retrieve tables values
$result = mysql_query("SELECT * FROM {$table}");
if (!$result) {
die("Query to show fields from table failed");
}
//build table and define headings
echo "<table border='1'>
<tr>
<th>Name</th>
<th>Version</th>
<th>Upload Date</th>
<th>Type</th>
<th>Uploader</th>
<th>Location</th>
</tr>";
// printing table rows
while($row = mysql_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $row['DocName'] . "</td>";
echo "<td>" . $row['DocVer'] . "</td>";
echo "<td>" . $row['DocDate'] . "</td>";
echo "<td>" . $row['DocType'] . "</td>";
echo "<td>" . $row['DocAuth'] . "</td>";
echo "<td>" . $row['DocLoc'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysql_free_result($result);
//close connecition to database
mysql_close($con)
?>`
我的第一个表格显示了文件位置,如上传/minegem/testdocument.pdf
作为链接显示的第二个表显示在地址栏http://localhost/uploads%2Fminegem%2Ftest+document.pdf
页面上写着
在此服务器上找不到请求的URL/uploads/minegem/test+document.pdf。
我认为这是一个愚蠢的文件结构问题,但它至关重要。最后,我将把它放在服务器上,以便能够存储完整的文件补丁,并回忆起作为链接将是非常好的。我希望有人能帮助我在正确的方向上建立正确的文件结构。谢谢 将文件名设置为test document.pdf是否至关重要?您还可以在PHP中重命名该文件:
<?php
//your upload script here
$filename = $_POST['filename']; //change this to the variable which stores filename
$new_filename = str_replace(' ', '_', $filename);
rename('c:/wamp/uploads/minegem/'.$filename,
'c:/wamp/uploads/minegem/'.$new_filename);
?>
然后再次尝试访问它。当您在浏览器上访问文件名时,文件名中的空格非常麻烦。请改用rawurlencode。这会将空格替换为%20,而不是加号 +用于传输数据,%20用于显示供单击的URL。虽然您始终可以使用用户%20进行数据传输,但如果浏览器不正确地支持+,则有时只能使用+。所以请坚持使用rawurlencode 此外,RawUrl仅在插入数据库之前对basename部分进行编码。这使路径不进行URL编码。我不认为这会破坏你的代码,但它更整洁
回答问题)如何仅对basename进行编码 A) 只需将basename存储在数据库中。您知道路径($directory),因此可以使用move_上传的文件(…,$directory.$target);然后在输出文件位置时,使用a href=”http://localhost/“.$directory.rawurlencode($target)。”
但还有一些其他“问题”也非常重要
我正试图建立一个网站,用户可以将文档等上传到服务器(这是一个封闭的网站),并生成一个表,显示链接到该文件的文件名。然后用户可以单击该链接并打开它。我完全不懂PHP等,我觉得这只是一个目录问题。我不需要在浏览器中查看文件,只需从我表格中的链接访问它们即可<代码>回显“”代码>现在当我将鼠标悬停在链接上时,它会显示
file:///C:/wamp/www/minegem%2F/uploads%2Ftest+document.pdf
我认为这是正确的,但它仍然没有加载文件。单击链接没有任何作用。上面的代码应该放在上载脚本之后,以便它将上载的文件重命名为文件名中没有空格的文件。那么表中的文件名都将使用下划线而不是空格。如果有什么不清楚的地方,请告诉我,以便我能进一步解释。@Hux:那不是解决问题的办法。请参见下面的另一个答案。您可能更容易理解。我已经添加了您的代码,但无论我在['filename']
中放置什么变量,它都会告诉我它未定义。谢谢Robbie。这听起来好像能奏效。我怎么能只对basename进行编码呢?答案中添加了更多内容。包括一些技巧,以确保安全地将数据输入数据库,以及在屏幕上显示信息。好的,我已经让它工作了。首先,我分配了一个变量$file$file=$\u FILES['upload']['name']
然后我使用该变量来存储在表中,而不是$target。现在,当我调用该表时,我可以rawcodeurl$docloc,它只是包含扩展名的文件名,我手动添加了文件夹位置。我可以简化这一点,并为此添加一个变量echo'代码>现在我的文件正在正确链接和打开。谢谢你的帮助。
<?php
//your upload script here
$filename = $_POST['filename']; //change this to the variable which stores filename
$new_filename = str_replace(' ', '_', $filename);
rename('c:/wamp/uploads/minegem/'.$filename,
'c:/wamp/uploads/minegem/'.$new_filename);
?>