上传的文件赢得';无法从表(PHP、MySQL)中打开(不正确的目录)

上传的文件赢得';无法从表(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

对不起,如果这是愚蠢的事情,但只是寻求一些真正的帮助。与此抗争

我有一个HTML脚本,它上载一个名为
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)。”


但还有一些其他“问题”也非常重要

  • 当您将文本输出到屏幕进行显示时,请确保对其使用httpspecialchars()

    [a href=”http://localhost/“.$directory.rawurlencode($target)。“].$directory.httpspecialchars($target)。”[/a]//用尖括号替换方括号-无法在此处输入尖括号

  • 在最低限度地保存到数据库时,请使用“mysql\u real\u escape\u string”以确保安全地进入数据库。但是强烈建议使用PDO或mysqli(mysql函数正在贬值,因为PDO和mysqli在设计上都更安全)


  • 我正试图建立一个网站,用户可以将文档等上传到服务器(这是一个封闭的网站),并生成一个表,显示链接到该文件的文件名。然后用户可以单击该链接并打开它。我完全不懂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); 
    
    ?>