0

これが愚かなことであるが、本物の助けを探しているだけなら申し訳ありません。これに苦労しています。

minegem.html呼び出されたファイルをアップロードする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)
?>`

両方のファイルがにあるC:/wamp/www/ので、Webブラウザーで実行すると、次のように表示されます。localhost/minegem.php

エンドユーザーに結果を表示するために実際に実行するスクリプトとなる最終的なスクリプトがあります。

<?php

//define variables to be used
$db_host = 'localhost';
$db_user = 'root';
$db_pwd = '';

$database = 'minetech';
$table = 'minegem';
$type = 'Guideline';

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

//this script will show table data
//retrieve tables values
$result = mysql_query("SELECT * FROM $table
WHERE DocType='Guideline'");
if (!$result) {
    die("Query to show fields from table failed");
}

//build table and define headings
echo "<table border='1'>
<tr>
<th>Document Name</th>
<th>Version</th>
</tr>";


// printing table rows
while($row = mysql_fetch_array($result))
{
$docname=$row['DocName'];
$docver=$row['DocVer'];
$doctype=$row['DocType'];
$docloc=$row['DocLoc'];

echo "<tr>";
echo '<td><a href='.urlencode($docloc).'>'.$docname.'</a></td>';
echo "<td>$docver</td>";
echo "</tr>";


}
echo "</table>";


mysql_free_result($result);

//close connecition to database
mysql_close($con)

?>

私の最初のテーブルは、ファイルの場所をuploads/minegem/test document.pdf 次のように示しています。2番目のテーブルは、リンクがアドレスバーに表示さhttp://localhost/uploads%2Fminegem%2Ftest+document.pdf れ、ページに 次のように表示されます。The requested URL /uploads/minegem/test+document.pdf was not found on this server.

これはばかげたファイル構造の問題だと思いますが、それは非常に重要です。私はこれをサーバーに配置することになりますので、完全なファイルパッチを保存し、リンクとしてそれを思い出すことができれば素晴らしいでしょう。誰かが正しいファイル構造を設定することで私を正しい方向に向けるのを手伝ってくれることを願っています。ありがとう。

4

2 に答える 2

0

代わりにrawurlencodeを使用してください。これにより、スペースがプラス記号ではなく%20に置き換えられます。

+はデータの転送に使用され、%20はクリックして表示されるURLに使用されます。データ転送にはいつでも%20を使用できますが、ブラウザが誤ってサポートしている場合は、+を使用できる場合があります。したがって、rawurlencodeに固執します。

また、データベースに挿入する前にのみ、basename部分をrawurlencodeします。これにより、パスはurlencodedされません。私はこれを考えていませんが、あなたのコードを壊していますが、それはとてもきれいです。


回答Q)ベース名だけをrawurlencodeする方法。

A)データベースにベース名を保存するだけです。パス($ directory)がわかっているので、move_uploaded_file(...、$directory。$target);を使用できます。次に、ファイルの場所を出力するときに、href = "http:// localhost /'。$directory.rawurlencode($ target)を使用します。'"


しかし、他にも非常に重要な「問題」がいくつかあります。

  1. 表示するためにテキストを画面に出力するときは、必ずhttpspecialchars()を使用してください。

    [a href = "http:// localhost /'。$directory.rawurlencode($ target)。'"]'。$directory.httpspecialchars($ target)。' [/a]//角かっこを山かっこに置き換えます-ここに山かっこを入力することはできません。

  2. 少なくともデータベースに保存するときは、「mysql_real_escape_string」を使用して、データベースに安全に入力できるようにします。ただし、 PDOまたはmysqliを使用することを強くお勧めします(mysql関数は減価償却されていますが、PDOとmysqliはどちらも設計上安全に使用できます)

于 2012-07-07T23:59:53.653 に答える
0

ファイル名をtestdocument.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); 

?>

次に、もう一度アクセスしてみてください。ファイル名のスペースは、ブラウザでアクセスするときに本当に問題になります。

于 2012-07-07T23:39:46.057 に答える