Как я могу получить URL каждого загруженного файла и отправить по электронной почте? - PullRequest
0 голосов
/ 16 ноября 2018

ОБЗОР: У меня есть форма, которая включает в себя 5 полей загрузки файлов. Сценарий php обрабатывает данные и отправляет 2 электронных письма (одно администратору и подтверждение для пользователя) И добавляет данные в файл .csv на сервере.

ВОПРОС: Как получить URL-адрес загруженных файлов в переменную, которую я могу использовать для заполнения электронной почты и файла .csv.

Все работает отлично, за исключением того, что мне нужна ссылка на каждый из загруженных файлов, включенных в электронные письма и в файл .csv. Я не могу понять эту часть после нескольких дней попыток.

УПРОЩЕННАЯ ФОРМА HTML:

<HTML><head><title>MultiFile Upload and Send Email</title></head><body>         
<form method='post' action='php/multiUploadTestProcess.php' multipart='' enctype='multipart/form-data'>
    <label for ='exhName'>Exhibitor Name:</label>
    <input type='text' name='exhName' multiple class='form-control'><br><br>
    Select File 1: <input type='file' name='img[]' multiple class='form-control' size='10'><br><br>
    Select File 2: <input type='file' name='img[]' multiple class='form-control' size='10'><br><br>
    Select File 3: <input type='file' name='img[]' multiple class='form-control' size='10'><br><br>
    Select File 4: <input type='file' name='img[]' multiple class='form-control' size='10'><br><br>
    Select File 5: <input type='file' name='img[]' multiple class='form-control' size='10'><br><br>
    <input type='submit' value='upload'>
</form>

PHP: ПРИМЕЧАНИЕ. Я удалил всю проверку / очистку, удалил добавление .csv и отправил вторую электронную почту. Я предполагаю, что, как только мы сможем получить ссылки на одно письмо, остальные будут почти такими же.

<?php
$exhName = $_POST['exhName'];
$exhNameNoSpace = str_replace(" ","-", $exhName);
$img = $_FILES['img'];
$to = 'DESTINATION-EMAIL@DOMAIN.com';
$subject = 'New File Uploads';
$email = 'ReplyYToEMAIL@DOMAIN.com';

if(!empty($img))
{
    /* reArrayFiles changes the array pattern for PHP's $_FILES (see function at end)  */
    $img_desc = reArrayFiles($img);
    print_r($img_desc);

    /* RENAME EACH FILE to current date, exhibitor name w/o spaces, and random integer string (ensuring no file overwrites). Then MOVE FILE to uploads */
    foreach($img_desc as $val)
    {
        $newname = date('m-d-Y',time()).'-'.$exhNameNoSpace.'-'.mt_rand().'.jpg';
        move_uploaded_file($val['tmp_name'],'../uploads/'.$newname);
        /* THIS FOLLOWING LINE WAS MY ATTEMPT AT GETTING A LINK TO EACH UPLOADED FILE BUT IS NOT WORKING. AND THE VARIABLE $newname HERE IS ADDING A NEW RANDOM INT TO THE FILENAME - NOT THE ONE THE FILE WAS SAVED WITH. */
        $filePath = '**Full Path To Directory**'.$newname;
    }
    /* SEND EMAIL TO ADMIN */
            $emailText = "=============================================\nYou have a new Market Place Application\n".
            "Here are the details:\n=============================================\n\n Exhibitor Name: $exhName \n\n Upload File 1: $filePath \n\n Upload File 2: $filePath \n\n ###";

            // All the neccessary headers for the email.
            $headers = array('Content-Type: text/plain; charset="UTF-8";',
                'From: ' . $email,
                'Reply-To: ' . $email,
                'Return-Path: ' . $email,
            );
            $emailText = wordwrap($emailText, 70);
            // Send email
            mail($to, $subject, $emailText, implode("\n", $headers));
    /* END SEND EMAIL TO ADMIN */
}
function reArrayFiles($file)
{
    $file_ary = array();
    $file_count = count($file['name']);
    $file_key = array_keys($file);

    for($i=0;$i<$file_count;$i++)
    {
        foreach($file_key as $val)
        {
            $file_ary[$i][$val] = $file[$val][$i];
        }
    }
    return $file_ary;
}   
?>

Помощь с благодарностью!

1 Ответ

0 голосов
/ 16 ноября 2018
  1. Если вы хотите вложить файл в ваши электронные письма, вам может потребоваться полный путь на сервере, а не внешний URL-адрес. Взгляните на realpath функцию PHP и попробуйте включить путь, в котором вы сохранили файл, в этот вызов функции, поэтому сделайте что-то вроде:

    $newname = date('m-d-Y',time()).'-'.$exhNameNoSpace.'-'.mt_rand().'.jpg';
    move_uploaded_file($val['tmp_name'],'../uploads/'.$newname);
    /* THIS FOLLOWING LINE WAS MY ATTEMPT AT GETTING A LINK TO EACH UPLOADED FILE BUT IS NOT WORKING. AND THE VARIABLE $newname HERE IS ADDING A NEW RANDOM INT TO THE FILENAME - NOT THE ONE THE FILE WAS SAVED WITH. */
    $filePath = realpath('../uploads/'.$newname);
    

после этого $filepath должен содержать полный путь к загруженному файлу на сервере.

  1. Если вы хотите добавить в свои письма ссылку с внешним URL-адресом, вам действительно нужен полный URL-адрес, но он зависит от имени домена и расположения папки для загрузки относительно корня (/) вашего домена. Это должно быть что-то вроде http://example.com/uploads/11-16-2018-name-6534.jpg, и вы можете выяснить это, проверив доступ к сгенерированным именам файлов через браузер, предполагая, что ваша папка для загрузки доступна через веб-сервер. Как только вы выясните URL-адрес, вы можете либо сохранить домен и путь в своем файле конфигурации, либо проверить, содержит ли $_SERVER['SERVER_NAME'] имя домена, и добавить его вместе с путем.

Чтобы использовать URL-адреса в тексте электронного письма, вам необходимо изменить код, например:

$emailText = "=============================================\nYou have a new Market Place Application\nHere are the details:\n=============================================\n\n Exhibitor Name: $exhName \n\n ";
$i = 1;
foreach($img_desc as $val)
{
    $newname = date('m-d-Y',time()).'-'.$exhNameNoSpace.'-'.mt_rand().'.jpg';
    move_uploaded_file($val['tmp_name'],'../uploads/'.$newname);
    /* THIS FOLLOWING LINE WAS MY ATTEMPT AT GETTING A LINK TO EACH UPLOADED FILE BUT IS NOT WORKING. AND THE VARIABLE $newname HERE IS ADDING A NEW RANDOM INT TO THE FILENAME - NOT THE ONE THE FILE WAS SAVED WITH. */
    $filePath = '**Full Path To Directory**'.$newname;
    $emailText .= "Upload File " . $i . ": " . $filePath . "\n\n";
    $i++;
}

// All the neccessary headers for the email.
$headers = array('Content-Type: text/plain; charset="UTF-8";',
            'From: ' . $email,
            'Reply-To: ' . $email,
            'Return-Path: ' . $email,
);
$emailText = wordwrap($emailText, 70);
// Send email
mail($to, $subject, $emailText, implode("\n", $headers));
...