Переименовать файлы в file_upload.php - PullRequest
1 голос
/ 05 сентября 2011

Как идиот, я согласился создать форму для клиента (я обычно просто занимаюсь кодированием HTML и CSS), которая включает PHP для отправки sendmail / file.Я не думал, что это будет слишком сложно из-за множества онлайн-уроков, и я все равно хотел начать изучать PHP.Я был откровенен с клиентом, что у меня нет опыта работы с PHP, и дал значительную скидку, поскольку я рассматриваю это как возможность обучения больше, чем работа по контракту.

У меня форма функционирует как две отдельные части во время разработки:

  1. sendmail.php
  2. file_upload.php.

Так что я очень горжусь собой.Однако сейчас я пытаюсь переименовать загруженные файлы следующим образом:

ClientCompanyName_ProjectName_FileName_Increment.Extension

Да, это кажется длинным, но клиент хочет ОЧЕНЬ ПРОСТОЙ способ дифференциации отдельных файлов в одном каталоге (я не знаю, как создатьновые уникальные каталоги, когда клиенты клиента загружают новые файлы).

Как я уже говорил, у меня была функция file_upload.php, работающая до того, как я пытался переименовать файлы.Как только я добавил код, который, как я ДУМАЛ, переименовал файл, извлекая из FORM полей ввода, я сломал PHP и теперь теряюсь, как заставить его работать как нужно.

Простая форманиже, и php, который я имею для form_input.php ниже.

<form action="./upload.php" method="post" enctype="multipart/form-data">
<label for="company">Company Name:</label><input type="text" name="company" id="company" />
<br />
<label for="proj_name">Project Name:</label><input type="text" name="proj_name" id="proj_name" />
<br />
<label for="file">Select a File:</label><input type="file" name="userfile" id="file" />
<br />
<input type="submit" name="submit" id="submit" value="Upload File" />
</form>

<?php
if (isset($_POST['submit'])) {
    // Configuration - Script Options
    $filename = $_FILES['userfile']['name']; // Get the name of the file (including file extension
    $file_basename = substr($filename, 0, strripos($filename, '.')); // Get file name minus extension
    $file_ext = substr($filename, strripos($filename, '.')); // Get file extension
    $filesize = $_FILES['file']['size']; // Get file size
    $allowed_file_types =      
        array('.jpg','.jpeg','.gif','.bmp','.png','.pdf','.doc','.docx','.psd'); 
        // These will be the types of files that are allowed to 
        // pass the upload validation
    $file_counter = 1; // used to increment filename if name already exists 
    $company = $_REQUEST['company']; 
    $project = $_REQUEST['proj_name'];

    // File renaming and upload functionality
    if (in_array($file_ext,$allowed_file_types) && ($filesize < 10000001)) { 
        // Checks to make sure uploaded file(s) is an allowed file 
        // type AND within the allowable file size (currently 10MB)
        // Rename File
        $newfilename = $company . '_' . $proj_name . '_' . $file_basename; 
        // Rename file as (CompanyName_FileName_DateStamp)
        // Loop until an available file name is found
        while (file_exists( "file_uploads/" . $newfilename ))
            $finalfilename = $newfilename . '_' . $file_counter++ . $file_ext; 
        // This will be the File Name shown in the upload destination directory
        // (currently the "file_uploads" directory)
        if (file_exists("file_uploads/" . $finalfilename)) {
            // file already exists error
            echo "This file already exists. Please rename this file and upload again if necessary."; 
        } else {
            move_uploaded_file($_FILES["file"]["tmp_name"], "file_uploads/" . $finalfilename); 
            echo "File uploaded successfully."; 
        } 
    }    elseif (empty($file_basename)) {
         // file selection error
         echo "Please select a file to upload."; 
    } elseif ($filesize > 10000000) {
        //file size error
        echo "The file you are trying to upload is too large. Files must be no larger than 10MB."; 
    } else {
        // file type error
        echo "The file you attempted to upload is not allowed. You can only upload the following types of files: .jpg, .jpeg, .gif, .bmp, .png, .pdf, .doc, .docx, and .psd."; 
        unlink($_FILES["file"]["tmp_name"]); 
    }
}

?>

Когда я пытаюсь загрузить файл сейчас, я получаю варианты следующей ошибки:

Parseошибка: синтаксическая ошибка, неожиданный T_ELSE в /home4/yourpass/public_html/upload/upload.php в строке 27

Когда я исправляю одну ошибку, в другой строке возникает новая похожая ошибка, и, наконец,Я получаю сообщение об ошибке Файл уже существует , но в каталоге на сервере нет повторяющегося файла.

Для тех из вас, кто хотел бы попробовать живую версию этой формы, выможете сделать это по этой ссылке:

http://www.niagarathistle.com/upload/form_upload.html

Любая помощь или толчок в правильном направлении будет принята с благодарностью.Спасибо!

PS: Извините за форматирование кода.Я все еще пытаюсь понять, как ЛЕГКО ввести мой код и правильно отформатировать его с помощью Markdown.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2011

Я нашел несколько мест, где ваш код работал не так, как ожидалось, и несколько опечаток. Приведенный ниже код работает на моем сайте Dreamhosted.

Конкретные проблемы, которые я исправил:

  • Ссылки на $_FILES['file'] должны были быть $_FILES['userfile'] (это может быть связано с вашим сервером, я не уверен, но вы изначально используете $_FILES['userfile'])
  • $newfilename необходимо добавить $file_ext
  • Добавлена ​​проверка для move_uploaded_file() успеха
  • Изменено $_REQUEST superglobal на $_POST (вы не должны использовать $_REQUEST, если нет необходимости)
  • Я учел ответ @Lars

Если вы хотите попробовать это, см .:

http://jfcoder.com/test/fileupload.php

Если вы хотите увидеть код, используйте следующую ссылку:

http://jfcoder.com/test/fileupload.php?show=true

Кроме того, я бы, вероятно, рекомендовал использовать библиотеку / framework / CMS вместо того, чтобы катить свой собственный код (если вы дизайнер, я бы посмотрел на CodeIgniter / ExpressionEngine ).

<?php
if (isset($_POST['submit'])) {
    // Configuration - Script Options
    $filename = $_FILES['userfile']['name']; // Get the name of the file (including file extension
    $file_basename = substr($filename, 0, strripos($filename, '.')); // Get file name minus extension
    $file_ext = substr($filename, strripos($filename, '.')); // Get file extension
    $filesize = $_FILES['userfile']['size']; // Get file size
    $allowed_file_types =      
        array('.jpg','.jpeg','.gif','.bmp','.png','.pdf','.doc','.docx','.psd'); 
        // These will be the types of files that are allowed to 
        // pass the upload validation
    $file_counter = 1; // used to increment filename if name already exists 
    $company = $_POST['company']; 
    $project = $_POST['proj_name'];

    // File renaming and upload functionality
    if (in_array($file_ext,$allowed_file_types) && ($filesize < 10000001)) { 
        // Checks to make sure uploaded file(s) is an allowed file 
        // type AND within the allowable file size (currently 10MB)
        // Rename File
        $newfilename = $company . '_' . $project . '_' . $file_basename . $file_ext;

        // $finalfilename will not be set, unless the while-loop is entered
        // so we just set a default one
        $finalfilename = $newfilename;

        while (file_exists( "file_uploads/" . $finalfilename ))
            $finalfilename = $newfilename . '_' . $file_counter++ . $file_ext;

        // This will be the File Name shown in the upload destination directory
        // (currently the "file_uploads" directory)
        if (file_exists("file_uploads/" . $finalfilename)) {
            // file already exists error
            echo "This file already exists. Please rename this file and upload again if necessary."; 
        } else {
            if (move_uploaded_file($_FILES["userfile"]["tmp_name"], "file_uploads/" . $finalfilename)) {
                echo "File uploaded successfully.";
                echo " <a href=\"/test/file_uploads/$finalfilename\">Link</a>";
            } else {
                echo "File not uploaded/moved successfully. ";
            } 
        } 
    }    elseif (empty($file_basename)) {
         // file selection error
         echo "Please select a file to upload."; 
    } elseif ($filesize > 10000000) {
        //file size error
        echo "The file you are trying to upload is too large. Files must be no larger than 10MB."; 
    } else {
        // file type error
        echo "The file you attempted to upload is not allowed. You can only upload the following types of files: .jpg, .jpeg, .gif, .bmp, .png, .pdf, .doc, .docx, and .psd."; 
        unlink($_FILES["userfile"]["tmp_name"]); 
    }
}

?>
0 голосов
/ 06 сентября 2011

В вашей логике есть ошибка:

    // Checks to make sure uploaded file(s) is an allowed file 
    // type AND within the allowable file size (currently 10MB)
    // Rename File
    $newfilename = $company . '_' . $proj_name . '_' . $file_basename;

    // $finalfilename will not be set, unless the while-loop is entered
    // so we just set a default one
    $finalfilename = $newfilename;

    while (file_exists( "file_uploads/" . $finalfilename ))
        $finalfilename = $newfilename . '_' . $file_counter++ . $file_ext; 

Теперь все работает.

...