Я обновился с Symfony 3.4 до 4.0 и проверил работу. Функция сохранения изображения сообщает «Завершено», но изображение не сохраняется. Поскольку место сохранения было установлено на web / uploads, в Image.php я изменил путь к каталогу изображений с web
на public
, но он не изменился. Что еще мне нужно изменить?
ImageController.php
public function saveAction(Request $request)
{
$response = new Response();
$imageService = $this->get("admin.imageService");
if ($token === $imageService->getImageToken($staffId, $uniq)) {
try {
$imageService->saveImage($image);
// Normal termination parameters #This is required for onComplete to fire on Mac OSX
$msg = $this->container->getParameter('uploadify_success');
} catch (\Exception $e) {
$msg = $e->getMessage();
$response->setStatusCode(400);
}
} else {
$msg = 'Access is illegal.';
$response->setStatusCode(400);
}
$response->send();
ImageService.php
public function saveImage(Image $image)
{
// Set the extension (already set when saving from an email attachment)
$ext = $image->getImageExtension();
if (!$ext && $image->getFileUpload()) {
$ext = $image->getFileUpload()->guessExtension();
$image->setImageExtension($ext);
}
// save
$this->entityManager->persist($image);
$this->entityManager->flush();
}
Image.php
private function getUploadRootDir()
{
// Absolute path to the location to save the uploaded file
return __DIR__.'/../../../../../../public/'.$this->getUploadDir();
}
/**
* Returns the image directory name
*
* @return string
*/
private function getUploadDir()
{
return 'uploads';
}
Постскриптум
index.html.twig
{% block javascripts %}
{{ parent() }}
<script src="{{ asset('uploadifive/jquery.uploadifive.js') }}"></script>
<script src="{{ asset('js/image.five.js') }}"></script>
{% endblock %}
{% block stylesheets %}
{{ parent() }}
<link rel="stylesheet" href="{{ asset('uploadifive/uploadifive.css') }}">
{% endblock %}
{# contentBody #}
{% block contentBody %}
{{ render(controller('AppBundle:Hq/Image:manager')) }}
{% endblock %}
manager.html.twig
<div class="tabcontent">
<div class="operations">
{{ form_start(form, {"attr": {"id": "uploadForm"}}) }}
{{ form_widget(form.fileUpload) }}
{{ form_rest(form) }}
{{ form_end(form) }}
</div>
<div id="fileQueue"></div>
</div>
Может быть, это вещь Symfony, но где код, который на самом деле загружает файл? Вы тоже меняли каталог назначения? — person benq_0511 schedule 26.02.2021
@AkenRoberts Я использую uploadifive, но кажется, что место сохранения зависит от настроек Symfony. — person benq_0511 schedule 26.02.2021
Можете ли вы проверить свой шаблон веточки / визуализированный HTML-код, который установлен enctype="application/x-www-form-urlencoded"
? — person benq_0511 schedule 26.02.2021
@dbrumann Нет. Не было настройки enctype. На всякий случай добавил файл веточки, пожалуйста, проверьте его. — person benq_0511 schedule 26.02.2021
Чтобы FileUpload работал, вы должны установить enctype в своей форме, например добавив его в {'attr': { 'enctype': 'multipart/form-data'}}
(я думаю). Вы можете увидеть это в этом бесплатном видео с SymfonyCasts: symfonycasts.com / screencast / symfony-uploads / — person benq_0511 schedule 26.02.2021
Вы должны использовать
projectDir
вместо своегоgetUploadRootDir()
с опасными../../
Взгляните на этот пост Symfony 4, получите корневой путь проекта из пользовательского класса (не класса контроллера) для получения подробных инструкций.
Новое в Symfony 3.3: https://symfony.com/blog/new-in-symfony-3-3-a-simpler-way-to-get-the-project-root-directory