Сумерки Laravel: загрузка тестового файла с помощью Dropzone.js

Я использую laravel 5.6 и Dusk для этого конкретного теста.

Я пытаюсь подтвердить загрузку файла в моей зоне сброса. Но моя Dropzone создана таким образом, что у меня нет элемента ввода file. Поэтому я не могу использовать метод attach().

Итак, я попробовал следующее

$file = new \Symfony\Component\HttpFoundation\File\UploadedFile(base_path() . '/tests/samples/Cylinder.stl', 'Cylinder.stl');

$response = $this->actingAs( $this->user )
                ->from( 'my-url' )
                ->post( route('attachments.store' ) , [
                    'file' => $file
                ]);

Но пакет ошибок содержит эту ошибку

"errors" => Illuminate\Support\ViewErrorBag {#1194             
  #bags: array:1 [                                             
    "default" => Illuminate\Support\MessageBag {#1189          
      #messages: array:1 [                                     
        "file" => array:1 [                                    
          0 => "The file failed to upload."                    
        ]                                                      
      ]                                                        
      #format: ":message"                                      
    }                                                          
  ]                                                            
}      

И, конечно, это работает, когда я делаю это вручную.


person Atnaize    schedule 09.08.2018    source источник
comment
Можете ли вы создать минимальный пример на jsfiddle.net?   -  person Jonas Staudenmeir    schedule 09.08.2018


Ответы (2)


Dropzonejs добавляет поле ввода с определенным классом «dz-hidden-input». Вы можете найти его в нижней части html-страницы, скорее всего, прямо перед тегом </body>:

<input type="file" multiple="multiple" class="dz-hidden-input">

Таким образом, вы можете сказать Dusk, чтобы он соответствовал именно этому селектору с помощью метода присоединения:

$browser->attach('input.dz-hidden-input', storage_path('app/public/testing/test-file.jpg'));

Если у вас есть предварительный просмотр dropzone, показывающий имя файла и кнопку «Удалить файл», вы можете затем связать некоторые утверждения, подобные этому, чтобы убедиться, что файл также может быть удален:

$browser->attach('input.dz-hidden-input', storage_path('app/public/testing/test-file.jpg'))
 ->assertSee('test-file.jpg')
 ->assertSeeLink('Remove file')
 ->clickLink('Remove file')
 ->assertDontSee('test-file.jpg');
person maelga    schedule 01.01.2019
comment
@EugenevanderMerwe Я подтвердил этот ответ на основе вашего комментария, потому что у меня нет среды, чтобы проверить его прямо сейчас. Но ответ кажется логичным и правильным. - person Atnaize; 28.03.2019

Как упоминалось в другом ответе, подход заключается в фиктивном поле ввода, которое создает dropzone.js. Однако, если у вас есть несколько отдельных дропзон, это нецелесообразное решение, поскольку нет способа определить, к какому полю ввода следует прикрепить файл.

Лучшее решение заключается в значении конфигурацииhiddenInputContainer для зоны сброса. Укажите значение, которое вы можете использовать для различения зон сброса, например div, содержащий настраиваемую зону сброса.

Затем вы можете прикрепить к нему файл (используя Faker в качестве ярлыка для создания файла):

$image = $faker->image('/tmp', 640, 480);
$browser->attach('#dropzone-image1 input.dz-hidden-input', $image);
$browser->attach('#dropzone-image2 input.dz-hidden-input', $image);
person Connor Cook    schedule 17.04.2019