5

上传文件时收到错误消息“无法访问文件 /tmp/php4k3bf8”。请参阅此处的完整错误日志。

[2017-08-13 15:50:29] request.INFO: Matched route "apply_for_job". {"route":"apply_for_job","route_parameters":{"_controller":"Vendor\\FinanceBundle\\Controller\\JobResponseController::createAction","job_id":"2850","_route":"apply_for_job"},"request_uri":"https://my.site.in/job-enrollment/open-position/2850/apply","method":"POST"} []
[2017-08-13 15:50:29] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
[2017-08-13 15:50:29] request.CRITICAL: Uncaught PHP Exception Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException: "The file /tmp/php4k3bf8 could not be accessed" at /mnt/hdd2/ya_guest/vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php line 127 {"exception":"[object] (Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException(code: 0): The file /tmp/php4k3bf8 could not be accessed at /mnt/hdd2/ya_guest/vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php:127)"} []

这是用于表单提交的实体:

<?php

namespace Vendor\FinanceBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\File;

/**
 * @ORM\Entity
 * @ORM\Entity(repositoryClass="Vendor\FinanceBundle\Repository\RRFPreScreenRepository")
 * @ORM\Table(name="vendor_finance_rrf_pre_screen")
 * @Vich\Uploadable
 */
class RRFPreScreen
{

    /**
     * Unique Id
     *
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    ///
    /// ...
    ///

    /**
     * NOTE: This is not a mapped field of entity metadata, just a simple property.
     *
     * @Vich\UploadableField(mapping="profile_image_prescreen", fileNameProperty="imageName")
     *
     * @var File $imageFile
     */
    protected $imageFile;

    /**
     * @ORM\Column(type="string", length=255, name="profile_image", nullable=true)
     *
     * @var string $imageName
     */
    protected $imageName;

    /**
     * @ORM\Column(type="datetime", name="updated_at", nullable=true)
     *
     * @var \DateTime $updatedAt
     */
    protected $updatedAt;

    public function __construct()
    {
        $this->created = new \DateTime('now');
    }

    /**
     * If manually uploading a file (i.e. not using Symfony Form) ensure an instance
     * of 'UploadedFile' is injected into this setter to trigger the  update. If this
     * bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
     * must be able to accept an instance of 'File' as the bundle will inject one here
     * during Doctrine hydration.
     *
     * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image
     */
    public function setImageFile(File $image = null)
    {
        $this->imageFile = $image;

        if ($image) {
            // It is required that at least one field changes if you are using doctrine
            // otherwise the event listeners won't be called and the file is lost
            $this->updatedAt = new \DateTime('now');
        }
    }
}

然后是表单类型:

<?php

namespace Vendor\FinanceBundle\Form\Type;

use Vendor\FinanceBundle\Entity\RRFPreScreen;
use Vendor\FormBundle\Form\Type\CountryType;
use Vendor\FormBundle\Form\Type\EducationalQualificationType;
use Vendor\FormBundle\Form\Type\FunctionalAreaType;
use Vendor\FormBundle\Form\Type\MultiFileType;
use Vendor\FormBundle\Form\Type\OtherLanguageType;
use Vendor\FormBundle\Form\Type\ProgramHistoryType;
use Vendor\FormBundle\Form\Type\StateIndiaType;
use Vendor\FormBundle\Form\Type\WorkLocationType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Vendor\FinanceBundle\Form\Type\RRFDocumentType;

class JobResponseType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $self = $this;
        $factory = $builder->getFormFactory();


        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function(FormEvent $event) use($self, $factory, $builder) {
                $form = $event->getForm();
                $preScreen = $event->getData();

                $form
                    ->add('firstName', TextType::class, array(
                        'attr' => array('data-section' => 'Personal Details'),
                        'label_attr' => array('data-note' => 'Please provide your name as displayed in your identity proof and expand all initials'),
                    ))
                    ->add('lastName', TextType::class, array())
                    ->add('phone', TextType::class)
                    ->add('email', TextType::class, array(
                        'label_attr' => array('data-note' => 'As we will be contacting you by mail, please double check the spelling of your mail id.')
                    ))

                    ///
                    /// ...
                    /// 

                    ->add('imageFile',FileType::class, array(
                        'required' => false,
                        'label' => 'Upload your profile picture',
                    ))
                    ->add('multiFiles', CollectionType::class, array(
                        'entry_type' => MultiFileType::class,
                        'allow_add' => true,
                        'allow_delete' => true,
                        'prototype' => true,
                        'prototype_name' => 'multiFiles__name__',
                        'by_reference' => false,
                        'required' => false,
                        'label' => 'Upload your CV, Cover Letter, or Certificates',
                        'label_attr' => array('class' => 'force-validation'),
                        'attr' => array('data-entry' => '1', 'data-max-entry' => '3', 'class' => 'suggested-rows col-sm-8')
                    ));
            }
        );

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Vendor\FinanceBundle\Entity\RRFPreScreen',
        ));
    }

    public function getName() {
        return 'rrf_pre_screen1';
    }
}

我很确定 imageFile 导致了这个问题,因为只有在我将属性添加到类之后才会出现错误。

最后在 config.yml 中配置 Vich:

  vich_uploader:
  db_driver: orm

  mappings:

      profile_image_prescreen:
          uri_prefix:         /uploads/images-prescreen
          upload_destination: %kernel.root_dir%/data/uploads/images-prescreen

          inject_on_load:     false #should the file be injected into the uploadable entity when it is loaded from the data store
          delete_on_update:   true #should the file be deleted when a new file is uploaded
          delete_on_remove:   true #should the file be deleted when the entity is removed

有谁知道如何解决这个问题?/tmp 文件夹的权限为 777。

更新:

我正在运行 Ubuntu 14.04 并且对服务器具有 root 访问权限。

更新 2

运行 ls -la /tmp/ 时,我得到以下输出:

my_username@servername:~/suvya$ ls -la /tmp/
total 4649812
drwxrwxrwt  6 root     root          36864 Aug 17 07:44 .
drwxr-xr-x 23 root     root           4096 Jul 19 07:14 ..
-rw-r--r--  1 root     root     4739987837 Aug 16 23:59 data_160817.tgz
-rw-r--r--  1 www-data www-data          6 Aug 13 20:28 dos-100.12.183.170
-rw-r--r--  1 www-data www-data          5 Jul 21 16:04 dos-103.16.71.202
-rw-r--r--  1 www-data www-data          6 Jul 22 09:55 dos-103.245.119.146
-rw-r--r--  1 www-data www-data          6 Aug 14 09:14 dos-103.42.174.116
-rw-r--r--  1 www-data www-data          6 Jul 29 17:04 dos-103.46.192.6
-rw-r--r--  1 www-data www-data          5 Jul 28 06:24 dos-106.51.37.22
-rw-r--r--  1 www-data www-data          6 Jul 22 09:27 dos-106.51.48.108
-rw-r--r--  1 www-data www-data          5 Aug  4 22:42 dos-110.172.170.68
-rw-r--r--  1 www-data www-data          6 Jul 28 02:46 dos-111.93.198.38
-rw-r--r--  1 www-data www-data          6 Jul 21 18:47 dos-115.110.134.131
-rw-r--r--  1 www-data www-data          5 Jul 19 15:55 dos-115.249.1.117
-rw-r--r--  1 www-data www-data          5 Aug  7 14:54 dos-117.239.110.178
-rw-r--r--  1 www-data www-data          6 Jul 26 09:28 dos-117.239.66.131
-rw-r--r--  1 www-data www-data          6 Aug  9 13:19 dos-122.15.252.20
-rw-r--r--  1 www-data www-data          6 Aug  5 11:26 dos-122.164.65.31
-rw-r--r--  1 www-data www-data          6 Aug  1 14:16 dos-155.94.150.75
-rw-r--r--  1 www-data www-data          6 Jul 24 12:05 dos-157.50.8.106
-rw-r--r--  1 www-data www-data          6 Jul 24 11:22 dos-157.50.9.96
-rw-r--r--  1 www-data www-data          6 Aug  9 22:09 dos-157.55.39.132
-rw-r--r--  1 www-data www-data          6 Jul 30 08:52 dos-157.55.39.137
-rw-r--r--  1 www-data www-data          6 Aug  9 22:11 dos-157.55.39.166
-rw-r--r--  1 www-data www-data          6 Aug 10 21:28 dos-157.55.39.171
-rw-r--r--  1 www-data www-data          6 Aug 15 22:36 dos-157.55.39.173
-rw-r--r--  1 www-data www-data          5 Aug 12 20:15 dos-157.55.39.174
-rw-r--r--  1 www-data www-data          6 Aug  2 22:54 dos-157.55.39.179
-rw-r--r--  1 www-data www-data          6 Jul 23 14:50 dos-157.55.39.191
-rw-r--r--  1 www-data www-data          6 Aug 15 22:39 dos-157.55.39.206
-rw-r--r--  1 www-data www-data          6 Jul 28 02:17 dos-157.55.39.233
-rw-r--r--  1 www-data www-data          6 Aug 15 22:37 dos-157.55.39.43
-rw-r--r--  1 www-data www-data          5 Jul 30 05:18 dos-157.55.39.71
-rw-r--r--  1 www-data www-data          5 Aug 12 20:16 dos-157.55.39.79
-rw-r--r--  1 www-data www-data          5 Aug  5 19:22 dos-157.55.39.81
-rw-r--r--  1 www-data www-data          6 Aug  9 22:10 dos-157.55.39.86
-rw-r--r--  1 www-data www-data          6 Jul 28 02:16 dos-157.55.39.88
-rw-r--r--  1 www-data www-data          5 Aug  4 22:14 dos-172.73.76.38
-rw-r--r--  1 www-data www-data          5 Jul 28 16:56 dos-175.138.239.41
-rw-r--r--  1 www-data www-data          6 Aug  7 08:02 dos-187.158.39.247
-rw-r--r--  1 www-data www-data          5 Jul 27 11:06 dos-1.9.102.127
-rw-r--r--  1 www-data www-data          6 Aug  2 23:44 dos-192.206.181.81
-rw-r--r--  1 www-data www-data          6 Jul 27 14:39 dos-202.129.198.162
-rw-r--r--  1 www-data www-data          5 Jul 19 11:05 dos-203.106.159.34
-rw-r--r--  1 www-data www-data          5 Aug  1 09:24 dos-207.46.13.104
-rw-r--r--  1 www-data www-data          6 Jul 30 08:52 dos-207.46.13.108
-rw-r--r--  1 www-data www-data          5 Aug 12 20:18 dos-207.46.13.115
-rw-r--r--  1 www-data www-data          6 Aug 10 21:27 dos-207.46.13.126
-rw-r--r--  1 www-data www-data          6 Jul 23 14:48 dos-207.46.13.128
-rw-r--r--  1 www-data www-data          5 Aug  5 19:22 dos-207.46.13.142
-rw-r--r--  1 www-data www-data          6 Jul 30 08:53 dos-207.46.13.18
-rw-r--r--  1 www-data www-data          5 Jul 20 18:22 dos-207.46.13.26
-rw-r--r--  1 www-data www-data          5 Jul 20 18:22 dos-207.46.13.39
-rw-r--r--  1 www-data www-data          6 Jul 24 11:21 dos-207.46.13.51
-rw-r--r--  1 www-data www-data          5 Jul 20 18:23 dos-207.46.13.72
-rw-r--r--  1 www-data www-data          6 Aug  9 22:09 dos-207.46.13.82
-rw-r--r--  1 www-data www-data          5 Aug  1 09:24 dos-207.46.13.94
-rw-r--r--  1 www-data www-data          5 Aug  3 05:09 dos-210.242.49.157
-rw-r--r--  1 www-data www-data          6 Jul 19 21:59 dos-220.225.141.237
-rw-r--r--  1 www-data www-data          6 Aug  6 15:12 dos-2.224.61.44
-rw-r--r--  1 www-data www-data          6 Aug 15 14:19 dos-223.225.135.102
-rw-r--r--  1 www-data www-data          5 Jul 19 23:43 dos-24.184.101.84
-rw-r--r--  1 www-data www-data          6 Jul 20 16:14 dos-27.100.26.179
-rw-r--r--  1 www-data www-data          6 Aug  2 18:20 dos-27.59.88.173
-rw-r--r--  1 www-data www-data          6 Jul 28 00:34 dos-27.62.23.187
-rw-r--r--  1 www-data www-data          6 Jul 19 18:31 dos-37.228.242.81
-rw-r--r--  1 www-data www-data          5 Jul 27 10:00 dos-40.77.167.136
-rw-r--r--  1 www-data www-data          6 Jul 23 14:50 dos-40.77.167.14
-rw-r--r--  1 www-data www-data          5 Jul 21 04:44 dos-42.60.136.149
-rw-r--r--  1 www-data www-data          6 Jul 23 08:08 dos-49.134.47.203
-rw-r--r--  1 www-data www-data          6 Aug  4 15:26 dos-49.178.4.104
-rw-r--r--  1 www-data www-data          6 Aug 13 20:12 dos-49.35.12.88
-rw-r--r--  1 www-data www-data          6 Aug  2 13:14 dos-59.124.164.111
-rw-r--r--  1 www-data www-data          6 Aug 13 07:43 dos-69.127.115.103
-rw-r--r--  1 www-data www-data          6 Jul 29 23:56 dos-78.13.186.72
-rw-r--r--  1 www-data www-data          6 Aug  7 10:26 dos-78.180.127.129
-rw-r--r--  1 www-data www-data          6 Aug  6 10:29 dos-89.212.48.222
-rw-r--r--  1 www-data www-data          6 Jul 25 17:59 dos-90.54.206.172
-rw-r--r--  1 www-data www-data          5 Aug  6 05:54 dos-97.123.243.123
drwxr-xr-x  2 root     root           4096 Aug 16 23:34 hsperfdata_root
drwxrwxrwt  2 root     root           4096 Jul 19 07:14 .ICE-unix
drwxr-xr-x  2 root     root           4096 Aug 16 23:56 webapp
-rw-r--r--  1 root     root       21040943 Aug 16 23:56 webapp_160817.tgz
drwxrwxrwt  2 root     root           4096 Jul 19 07:14 .X11-unix
4

1 回答 1

1

我不确定,但下面可能是ls -la /tmp/输出的问题。

my_username@servername:~/suvya$ ls -la /tmp/ total 4649812 drwxrwxrwt 6 root root 36864 Aug 17 07:44。

似乎 /tmp 所有者是 root 我猜它应该是 HTTP 即www-data

如果是这种情况,那么您可以从 php.ini 文件更改 tmp 目录位置并设置为项目中的某个位置说

upload_tmp_dir="your_project_base_path/tmp"

于 2017-08-22T11:46:36.310 回答