Ant*_*ent 5 php forms email swiftmailer symfony
我正在处理一个 symfony 项目,我有一个表格,必须使用 swiftmailer 发送邮件。为了说明 -> 用户可以在表单的可选文件的上传功能中使用附件。(表单保存在bdd like命令中,提交表单后我们有一个回顾,还有3封邮件(我们不使用附件的两封邮件每次都有效,只有带有附件选项的邮件在我们有一个文件要加入,否则如果我们只使用评论(另一个像路径一样工作的字段可选,邮件正在工作)
我希望我的解释清楚易懂,我的英语不完美,功能也不太容易。由于某些信息的机密性,我只在这里写了与邮件有关的代码,但如果我忘记了某些信息,请告诉我并更新帖子。
当我发送没有附件的邮件时,我没有任何问题,它可以正常工作,但是当我尝试加入文件时,symfony 给我这个错误:
无法打开文件进行阅读 [uploads/6M.jpg]
我试图在 StackOverflow 的其他帖子上找到解决方案,但没有人在工作。所以我会让你帮助我,我希望。
命令实体(我只是将有关文件、路径和上传的代码放在附件中(邮件程序的其余部分/和代码工作):
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Form\Extension\HttpFoundation;
/**
* Commandes
*/
class Commandes
{
// CUSTOM CODE
/**
* @var string
*/
public $file3;
/**
* @var string
*/
protected $path3;
public function getAbsolutePath1()
{
return null === $this->path1 ? null : $this->getUploadRootDir().'/'.$this->id.'.'.$this->path1;
}
public function getWebPath1()
{
return null === $this->path1 ? null : $this->getUploadDir().'/'.$this->path1;
}
protected function getUploadRootDir()
{
return __DIR__ . '/../../../web/' . $this->getUploadDir();
}
protected function getUploadDir()
{
return 'uploads';
}
/**
* @var string
*/
protected $path1;
/**
* @Assert\File(maxSize="60000000")
*/
public $file1;
// CallBack : preUpdate | prePersist \\
public function preUpload1()
{
if (null !== $this->file1) {
$this->path1 = $this->file1->guessExtension();
}
}
// CallBacks : PostPersist | PostUpdate \\
public function upload1()
{
if (null === $this->file1) {
return;
}
$this->file1->move($this->getUploadRootDir(), $this->getReferencePatient() . 'M.' . $this->file1->guessExtension());
$this->path1 = $this->getReferencePatient() . 'M.' . $this->file1->getClientOriginalExtension();
$this->file1 = null;
}
protected $path2;
public $file2;
// CallBack : preUpdate | prePersist \\
public function preUpload2()
{
if (null !== $this->file2) {
$this->path2 = $this->file2->guessExtension();
}
}
// CallBacks : PostPersist | PostUpdate \\
public function upload2()
{
if (null === $this->file2) {
return;
}
$this->file2->move($this->getUploadRootDir(), $this->getReferencePatient() . 'm.' . $this->file2->guessExtension());
$this->path2 = $this->getReferencePatient() . 'm.' . $this->file2->getClientOriginalExtension();
$this->file2 = null;
}
public function getAbsolutePath2()
{
return null === $this->path2 ? null : $this->getUploadRootDir() . '/' . $this->path2;
}
public function getWebPath2()
{
return null === $this->path2 ? null : $this->getUploadDir() . '/' . $this->path2;
}
// CallBack : preUpdate | prePersist \\
public function preUpload3()
{
if (null !== $this->file3) {
$this->path3 = $this->file3->guessExtension();
}
}
public function upload3()
{
if (null === $this->file3) {
return;
}
$this->file3->move($this->getUploadRootDir(), $this->getReferencePatient() . '.' . $this->file3->guessExtension());
$this->path3 = $this->getReferencePatient() . '.' . $this->file3->getClientOriginalExtension();
$this->file3 = null;
}
public function getAbsolutePath3()
{
return null === $this->path3 ? null : $this->getUploadRootDir() . '/' . $this->path3;
}
public function getWebPath3()
{
return null === $this->path3 ? null : $this->getUploadDir() . '/' . $this->path3;
}
/**
* Set pathPJ1
*
* @param string $pathPJ1
* @return Commandes
*/
public function setPathPJ1($pathPJ1)
{
$this->pathPJ1 = $pathPJ1;
return $this;
}
/**
* Get pathPJ1
*
* @return string
*/
public function getPathPJ1()
{
return $this->pathPJ1;
}
/**
* Set pathPJ2
*
* @param string $pathPJ2
* @return Commandes
*/
public function setPathPJ2($pathPJ2)
{
$this->pathPJ2 = $pathPJ2;
return $this;
}
/**
* Get pathPJ2
*
* @return string
*/
public function getPathPJ2()
{
return $this->pathPJ2;
}
/**
* Set pathPJ3
*
* @param string $pathPJ3
* @return Commandes
*/
public function setPathPJ3($pathPJ3)
{
$this->pathPJ3 = $pathPJ3;
return $this;
}
/**
* Get pathPJ3
*
* @return string
*/
public function getPathPJ3()
{
return $this->pathPJ3;
}
/**
* Set path1
*
* @param string $path1
* @return Commandes
*/
public function setPath1($path1)
{
$this->path1 = $path1;
return $this;
}
/**
* Get path1
*
* @return string
*/
public function getPath1()
{
return $this->path1;
}
/**
* Set path2
*
* @param string $path2
* @return Commandes
*/
public function setPath2($path2)
{
$this->path2 = $path2;
return $this;
}
/**
* Get path2
*
* @return string
*/
public function getPath2()
{
return $this->path2;
}
/**
* Set path3
*
* @param string $path3
* @return Commandes
*/
public function setPath3($path3)
{
$this->path3 = $path3;
return $this;
}
/**
* Get path3
*
* @return string
*/
public function getPath3()
{
return $this->path3;
}
Run Code Online (Sandbox Code Playgroud)
Commande Controller(同样的事情我只放了关于附件的代码):
use Symfony\Component\HttpFoundation\Request;
use OrthoBundle\Entity\Compteur;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use OrthoBundle\Entity\Commandes;
use OrthoBundle\Form\Type\CommandesType;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\Session;
class FormulaireController extends Controller
{
public function createFormulaireAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$commande = new Commandes();
$request = $this->get('request');
$user = $this->getUser();
$form = $this->createForm(new CommandesType($user), $commande);
if ($form->isValid() && $form->isSubmitted()) {
***""""""SOME CODE THAT I DON'T PUT ABOUT PERSIST FLUSH THE COMMAND IN DB""""***
$message = \Swift_Message::newInstance()
->setSubject('Commande n°' . $commande->getId())
->setFrom(array('mymail@example.com' => 'send from'))
->setTo(array('onemail@example.com' => 'destinatory'))
->setCharset('utf-8')
->setContentType('text/html')
->setBody($this->renderView('@Ortho/Mail/mail_impress.html.twig', array(
'parentUser' => $user->getParent(),
'commande' => $commande,
)));
if ($commande->getWebPath1() != '') {
$message->attach(\Swift_Attachment::fromPath($commande->getWebPath1()));
}
if ($commande->getWebPath2() != '') {
$message->attach(\Swift_Attachment::fromPath($commande->getWebPath2()));
}
if ($commande->getWebPath3() != '') {
$message->attach(\Swift_Attachment::fromPath($commande->getWebPath3()));
}
if ($commande->getWebPath1() != '' or
$commande->getWebPath2() != '' or
$commande->getWebPath3() != '' or
$commande->getCommentaire() != '') {
$this->get('mailer')->send($message);
}
Run Code Online (Sandbox Code Playgroud)
此代码适用于没有附件的邮件,但如果我尝试以文件形式上传邮件,则邮件不会发送。有关信息:文件的上传工作和上传的文件保存在 MyApp/web/uploads 中。
CommandeType.php :
<?php
namespace MyBundle\Form\Type;
use MyBundle\Entity\Utilisateurs;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityRepository;
class CommandesType extends AbstractType
{
private $user;
public function __construct(Utilisateurs $utilisateurs)
{
$this->user = $utilisateurs;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('commentaireLabo', TextareaType::class, array(
'attr' => array(
'placeholder' => 'Select a product'
),
))
->add('file1', FileType::class, array(
'required' => false
))
->add('file2', FileType::class, array(
'required' => false
))
->add('file3', FileType::class, array(
'required' => false
))
->add('commentairePrestataire', TextareaType::class, array(
'required' => false
));
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MyBundle\Entity\Commandes'
));
}
Run Code Online (Sandbox Code Playgroud)
}
此处查看有关文件的表格部分:
<fieldset class="smallbloc"> <!-- Bloc n°3 : Les pièces jointes -->
<h2 class="fs-title">Pièces jointes complémentaires</h2>
<h3 class="fs-subtitle">Toutes les pièces jointes à apporter à la commande.</h3>
{{ form_label(form.file1, "Arcade Maxilaire :") }}
{{ form_errors(form.file1) }}
{{ form_widget(form.file1) }}
{{ form_label(form.file2, "Arcade Mandibulaire :") }}
{{ form_errors(form.file2) }}
{{ form_widget(form.file2) }}
{{ form_label(form.file3, "Autre pièces jointe :") }}
{{ form_errors(form.file3) }}
{{ form_widget(form.file3) }}
{{ form_label(form.commentairePrestataire3D, "Commentaires pour le prestataire 3D :") }}
{{ form_errors(form.commentairePrestataire3D) }}
{{ form_widget(form.commentairePrestataire3D) }}
<input type="hidden" id="monthstat" name="monthstat" value="{{ "now"|date("m-Y") }}">
<input type="button" name="previous" class="previous action-button" value="Précédent"/>
<input type="submit" name="previous" class="action-button" value="ENVOYER"/>
{{ form_rest(form) }}
</fieldset>
Run Code Online (Sandbox Code Playgroud)
我希望所有必要的代码都在这里,并且我没有忘记一些东西,如果不是刚刚说过的话,我将更新我的帖子,并添加缺少的部分。或者,如果我说了一些无脑的或无法理解的事情,就说我是为了解释。我知道阅读 x) 并不容易。谢谢大家的帮助。
附加文件时必须使用文件系统的绝对路径,例如:
$message->attach(\Swift_Attachment::fromPath($commande->getAbsolutePath1()));
Run Code Online (Sandbox Code Playgroud)
SwiftMailer在“服务器端”运行,它不会访问您的前端来获取您想要附加到邮件的文件。
PS:您可能还想检查您的文件是否确实存在于其应在的目录中。也许上传没有按预期进行并且文件不存在
归档时间: |
|
查看次数: |
4825 次 |
最近记录: |