【问题标题】:How can I get the URL of each uploaded file and send through email?如何获取每个上传文件的 URL 并通过电子邮件发送?
【发布时间】:2018-11-16 19:28:26
【问题描述】:

概述: 我有一个包含 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;
}   
?>

非常感谢您的帮助!

【问题讨论】:

    标签: php phpmailer multiple-file-upload


    【解决方案1】:
    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));
    

    【讨论】:

    • 感谢您的回复!我查看了 realPath 并在上面尝试了您的解决方案。起初是没有返回任何东西,然后我改变了这一行:'$filePath = realpath('../uploads/'.$newname);'到 '$filePath = realpath('../uploads/').$newname;'它确实返回了文件的路径。然而
    • 这就是您的预期吗?如果您想要服务器上的路径或文件的公共 URL,您的问题并不清楚
    • 感谢您的回复!尝试了您的解决方案。起初它没有返回任何东西,然后我改变了这一行:'$filePath = realpath('../uploads/'.$newname);'到 '$filePath = realpath('../uploads/').$newname;'它返回文件的路径。但是,返回的文件名包含与实际文件不同的 rndm 字符串。还为每个文件返回相同的文件名,而不是单个名称。希望在电子邮件和 .csv 中包含文件的公共 URL。公共 URL 不是问题,返回每个文件的文件名是我似乎无法解决的问题。
    • 如果你将realpath('../uploads/').$newname 转储到foreach 循环中,你应该会看到不同的文件名,并且它们都应该是正确的
    • 好的,我想我们已经接近了。我在循环中添加了var_dump($filePath);,在循环之后添加了print_r($filePath);,它确实显示了上传的真实文件名。但我不知道如何将每个单独的文件名从转储中获取到电子邮件正文中。
    猜你喜欢
    • 2014-03-22
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2010-12-07
    • 2011-09-02
    • 1970-01-01
    相关资源
    最近更新 更多