Изображение из URL-адреса является строкой, а не UploadFile instanceOf ¿почему?

avatar
Pablo Gonzalez
8 апреля 2018 в 00:05
474
1
0

Давно ищу решение этой проблемы. Это img => https://www.siweb.es/images/logo-light.png Я хочу сохранить это изображение в виде zip-файла с помощью OneupUploaderBundle. Итак, когда я получаю изображение из URL-адреса с помощью file_get_contents или CURL, оно возвращает изображение правильно, но когда я передаю этот файл в $zip->addFile(); или служба uoload, использующая Symfony\Component\HttpFoundation\File\UploadedFile, возвращает ошибку, потому что они получают строку в качестве первого параметра.

Думаю, проблема в том, что файл не является instanceOf UploadeFile, но я не знаю, как его преобразовать или использовать Filebag без формы.

public function testAction(Request $request){
    $term = 'https://www.siweb.es/images/logo-light.png';

    $image = $this->getimg($term);

    if ($image instanceof UploadedFile){
        $upload = $this->get('pablo.file_upload_service')->uploadZipFile($image,'test');
    }
    return $this->render('@pabloUser/Test/zip_test.html.twig',['upload' => $image]);
}

private function getimg($url) {
    $headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';
    $headers[] = 'Connection: Keep-Alive';
    $headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';
    $user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';
    $process = curl_init($url);
    curl_setopt($process, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($process, CURLOPT_HEADER, 0);
    curl_setopt($process, CURLOPT_USERAGENT, $user_agent);
    curl_setopt($process, CURLOPT_TIMEOUT, 30);
    curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
    $return = curl_exec($process);
    curl_close($process);
    return $return;
}

И служба:

public function uploadZipFile(UploadedFile $file,$folder){
    // Check if the file's mime type is in the list of allowed mime types.
    if (!in_array($file->getClientMimeType(), self::$allowedMimeTypes)) {
        $this->pushbulletService->notification('Error en la subida de archivos',sprintf('Files of type %s are not allowed.', $file->getClientMimeType()));
        throw new \InvalidArgumentException(sprintf('Files of type %s are not allowed.', $file->getClientMimeType()));
    }

    // Generate a unique filename based on the date and add file extension of the uploaded file
    $filename = sprintf('%s/%s.%s', $folder, uniqid(), $file->getClientOriginalExtension());

    $zipname = 'file.zip';
    $zip = new \ZipArchive();
    $zip->open($zipname,\ZipArchive::CREATE);
    $zip->addFile($file);
    $zip->close();

    $adapter = $this->filesystem->getAdapter();
    $adapter->write($filename, $zipname);

    return $filename;
}
Источник
Smaïne
8 апреля 2018 в 05:39
0

Вы пытались file_get_contents получить изображение и передать его в UploadedFile?

Ответы (1)

avatar
dbrumann
8 апреля 2018 в 09:34
1

Проблема в том, что ваш результат из getimg представляет собой (двоичную) строку, содержащую данные изображения. Чтобы передать его как UploadedFile, вы должны сначала сохранить изображение во (временном) файле, а затем передать путь к нему в конструкторе.

Это может выглядеть примерно так:

$data = $this->getimg(...);

file_put_contents(sys_get_temp_dir() . '/filename.jpg', $data);
$image = new UploadedFile(
    sys_get_temp_dir() . '/logo-light.png',
    'logo-light.png'
);

$upload = $this->get('pablo.file_upload_service')->uploadZipFile($image,'test');
Pablo Gonzalez
8 апреля 2018 в 10:20
1

Потрясающе @dbrumann. Просто исправление. Временный путь должен быть одинаковым в file_put_contents и в новом UploadedFile. Что-то вроде sys_get_temp_dir().'/filename.jpg'

dbrumann
8 апреля 2018 в 12:10
0

Да ты прав. Я просто имя файла, который вы запрашивали позже, и забыл этот вызов метода. Хороший улов.