3

だから私は、ユーザーがドキュメントまたはdocxのみをアップロードできるようにしたい. まず、ここに私のhtmlがあります:

<form action="upload_file.php" method="post" enctype="multipart/form-data">
    Select a file: <input type="file" name="img">
    <input type="submit">
</form>

そして、ここに私のphpがあります:

$allowedExts = array("doc", "docx");
    $extension = end(explode(".", $_FILES["file"]["name"]));

    if ($extension!=".doc" || $extension!=".doc"
    && ($_FILES["file"]["size"] < 200000)
    && in_array($extension, $allowedExts)) {
        if ($_FILES["file"]["error"] > 0)
        {
            echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
        }
        else
        {
            echo "Upload: " . $_FILES["file"]["name"] . "<br />";
            echo "Type: " . $_FILES["file"]["type"] . "<br />";
            echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
            echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

            if (file_exists("Proposals/" . $_FILES["file"]["name"]))
            {
                echo $_FILES["file"]["name"] . " already exists. ";
            }
            else
            {
                move_uploaded_file($_FILES["file"]["tmp_name"],
                "Proposals/" . $_FILES["file"]["name"]);
                echo "Stored in: " . "Proposals/" . $_FILES["file"]["name"];
            }
        }
    } else {
        echo "Invalid file";
    }

ファイルをアップロードしようとするたびに、それがドキュメントであろうとpngであろうと、これを出力します:

Upload: 
Type: 
Size: 0 Kb
Temp file: 
already exists.

そして、Proposals フォルダーには何もアップロードされません。だから私は 2 つの質問があります:
1) 私のコードの問題は何ですか?
2) upload_file.php にリダイレクトし、メッセージを表示します。実際にメイン ページに戻って、成功したというテキストを表示する方法はありますか?

4

5 に答える 5

5

最初の質問はすでに回答されているので、再度回答することはありません。

2) upload_file.php にリダイレクトし、メッセージを表示します。実際にメイン ページに戻って、成功したというテキストを表示する方法はありますか?

通常は、リダイレクトされたページに成功メッセージを表示する方が適切ですが、次の 2 つの方法で解決できます。

  • 以前の URL を保存 (または知っている) し、次のようにリダイレクトします。header("Location: old_page.php");
  • フォームのターゲットを iframe にします。つまり、メイン ページ自体はリダイレクトされず、upload_file.php (iframe に読み込まれる) からの応答をバブルするだけで、アプリのシームレスなアップロードが可能になります。

また、これはファイル拡張子を取得する最良の方法ではありません。

$extension = end(explode(".", $_FILES["file"]["name"]));

代わりに pathinfo を使用してみてください: http://php.net/manual/en/function.pathinfo.php

$extension = pathinfo( $_FILES["file"]["name"], PATHINFO_EXTENSION);

そしてあなたのif声明:

if ($extension!=".doc" || $extension!=".doc"
    && ($_FILES["file"]["size"] < 200000)
    && in_array($extension, $allowedExts)) {

これは小さな使用法ですが、in_array配列を検索するより実用的な方法を使用することをお勧めします: http://php.net/manual/en/function.array-search.php

だからあなたifは次のようになります:

if (($_FILES["file"]["size"] < 200000) && array_search($extension, $allowedExts)!==false) {
于 2012-10-02T14:13:31.260 に答える
4

あなたのファイル フィールド名はimgであり、使用$_FILES["file"]したことがありますが、そうである必要があります$_FILES["img"]

また、if条件を変更する必要があります

if (($_FILES["file"]["size"] < 200000)
    && in_array($extension, $allowedExts)) {

の必要はありません

$extension!=".doc" || $extension!=".doc" &&

于 2012-10-02T14:08:21.423 に答える
2

変化する

$extension!=".doc" || $extension!=".doc"

$extension!=".doc" || $extension!=".docx"

ファイルタイプにname プロパティがあるため、$_FILES['img']代わりに使用します。$_FILES['file']img

于 2012-10-02T14:09:55.777 に答える
2
  1. $_FILES["img"] 配列を使用して、アップロードされたファイルのプロパティにアクセスしてみてください (「ファイルの選択」入力は「img」と呼ばれます)。

  2. 「Location」http ヘッダーを使用して、ソース ページにリダイレクトすることができます。

于 2012-10-02T14:13:11.580 に答える
2

$_FILES["img"]入力名の代わりに使用する$_FILES["file"]か、名前を「ファイル」に変更する必要があります。

于 2012-10-02T14:08:35.310 に答える