16

一如既往,这里是我学到很多东西的地方。我现在有一个新的东西要学:

我有一个html表单:

<tr><td width="16%">File attachment</td><td width="2%">:</td><td><input type="file" name="fileatt" /></td></tr>

和一个mail.php:

$attachfile=$_POST["fileatt"];

以及用于发送电子邮件的正确 swiftmailer 代码;

我在谷歌上搜索过,我发现了很多示例如何使用存储在网站上的文件发送附件,但我想即时进行。因此,当您提交按钮时,它会将其发送给人们,而不是上传文件。

// Create the Transport
$transport = Swift_SmtpTransport::newInstance('mail.server.co.uk', 25)
->setUsername('user')
->setPassword('pass')
;

// Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);

// Create a message
$message = Swift_Message::newInstance($subject)
  ->setFrom(array('emai@emai.com' => 'name'))

   ->setBody($html, 'text/html')
  ;
// Add alternative parts with addPart()
$message->addPart(strip_tags($html), 'text/plain');

// Send the message
$result = $mailer->send($message);

任何人都可以帮助我如何进行动态文件上传,好吗?提前致谢!!!

4

3 回答 3

42

有一个简单的方法可以做到这一点,你去:

$message->attach(
Swift_Attachment::fromPath('/path/to/image.jpg')->setFilename('myfilename.jpg')
);

这是 SwiftMail 可以做到这一点的一种方式,现在只是 /tmp 文件,并将上面的内容转换为以下内容:

假设:fileatt 是 $_FILE 的变量,['tmp_name'] 实际上是 PHP 从表单上传创建的 tmp 文件。

$message->attach(
Swift_Attachment::fromPath($_FILES['fileatt']['tmp_name'])->setFilename($_FILES['fileatt']['name'])
);

有关 SwiftMail 附件的更多信息,请参阅此文档页面

关于 $_FILES 的更多信息可以在 w3schools 上找到,尽管我不喜欢w3schools,但这个页面是可靠的。

于 2012-07-03T23:05:51.547 回答
5

另一种方法是,仅使用一个变量作为路径和文件名:

$message->attach(Swift_Attachment::fromPath('full-path-with-attachment-name'));
于 2015-02-10T09:18:26.287 回答
1

单个附件

我的回答与 André Catita 的类似。但是,在 Laravel 6 中,您可以使用$request代替$_FILES。让我简化上面的代码:

$path = $request->file('import')->getPathName();
$fileName = $request->file('import')->getClientOriginalName();      

$message->attach(
        Swift_Attachment::fromPath($path)->setFilename($fileName)
        );

这里我假设你的文件标签的名字是 import。例如:<input type="file" name="import" />

多个附件

现在,假设您需要多个附件,而不是单个附件。然后需要更改代码。

首先,您的 html 代码将变为:<input type="file" name="import[]" multiple />

对于后端或 laravel;代码将是:

$files = $request->file('import');
foreach($files as $file){

        $path = $file->getPathName();
        $fileName = $file->getClientOriginalName();      

        $message->attach(
            Swift_Attachment::fromPath($path)->setFilename($fileName)
            );
}
于 2020-02-13T09:01:55.973 回答