Загрузка файлов по ссылке

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Загрузка файлов по ссылке

Сообщение BalykhinAS »

дико извеняюсь но не нашел стандартного решения загрузки файлов не через POST форму а по ссылке. есть такие методы?
Alex@
Сообщения: 568
Зарегистрирован: 2014.12.16, 09:24

Re: Загрузка файлов по ссылке

Сообщение Alex@ »

Я делал так

Код: Выделить всё

Yii::$app->response->format = Response::FORMAT_RAW;
        $model = ListProtocolsFiles::findOne(['id' => $id]);
        if(is_null($model)){
            throw new ForbiddenHttpException(
                'Данные не найдена!'
            );
        }
        $pathSave = $_SERVER['DOCUMENT_ROOT'] . $this->module->dirSave.$prefix.'/'.
            $model->protocols_id;
        $file = $pathSave.'/'.$model->name_file;

        return $this->render('downloads-file',[
            'file'  => $file,
        ]);
во вьюхе

Код: Выделить всё

Yii::$app->response->sendFile($file);
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Загрузка файлов по ссылке

Сообщение BalykhinAS »

Alex@ писал(а): 2018.02.27, 02:25 Я делал так

Код: Выделить всё

Yii::$app->response->format = Response::FORMAT_RAW;
        $model = ListProtocolsFiles::findOne(['id' => $id]);
        if(is_null($model)){
            throw new ForbiddenHttpException(
                'Данные не найдена!'
            );
        }
        $pathSave = $_SERVER['DOCUMENT_ROOT'] . $this->module->dirSave.$prefix.'/'.
            $model->protocols_id;
        $file = $pathSave.'/'.$model->name_file;

        return $this->render('downloads-file',[
            'file'  => $file,
        ]);
во вьюхе

Код: Выделить всё

Yii::$app->response->sendFile($file);
этот пример отдает пользователю файл?

Мне необходимо загружать файл на сервер по ссылке с валидациями
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Загрузка файлов по ссылке

Сообщение BalykhinAS »

что то вроде

Код: Выделить всё

$dir = 'uploads';

$urlFile = 'http://site.ru/image.jpeg';

$file = new DownloadFile($urlFile);
$file->download();
// ... тут можно провести валидацию
$file->saveAs($dir . '/' . $file->getBaseName() .'.'. $file->getExtension());

Код: Выделить всё

<?php

namespace common\services;

use yii\base\BaseObject;

class DownloadFile extends BaseObject
{
    static $tmpDir;

    public $urlFile;

    public $tmpFile;

    public $name;

    public $size;

    public $type;

    public $loaded;

    public function __construct($urlFile)
    {
        $this->urlFile = $urlFile;
        $this->init();
    }

    public function __destruct()
    {
        if($this->tmpFile && file_exists($this->tmpFile)) {
            @unlink($this->tmpFile);
        }
    }

    public function init()
    {
        parent::init();

        if(!self::$tmpDir) {
            //self::$tmpDir = sys_get_temp_dir()
            self::$tmpDir = ini_get('upload_tmp_dir');
        }
        
        $data = $this->getStat($this->urlFile);

        if(!empty($data)) {
            if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
                $size = (int)$matches[1];
            }
            if (preg_match('/^HTTP\/1\.[01] (\d\d\d)/', $data, $matches)) {
                $status = (int)$matches[1];
            }
            if (preg_match('/Content-Type: ([a-z\/]+)/', $data, $matches)) {
                $type = $matches[1];
            }
        }

        if($status == '200') {
            $this->name = basename($this->urlFile);
            $this->type = $type;
            $this->size = $size;
        }
    }

    public function getBaseName()
    {
        $pathInfo = pathinfo('_' . $this->name, PATHINFO_FILENAME);
        return mb_substr($pathInfo, 1, mb_strlen($pathInfo, '8bit'), '8bit');
    }

    public function getExtension()
    {
        return strtolower(pathinfo($this->name, PATHINFO_EXTENSION));
    }

    public function download()
    {
        if(!file_exists(self::$tmpDir)) {
            return false;
        }
        
        $this->tmpFile = tempnam(self::$tmpDir, null);

        if(file_exists($this->tmpFile) && file_put_contents($this->tmpFile, file_get_contents($this->urlFile))) {
            $this->loaded = true;
            return $this;
        }
        return false;
    }

    public function saveAs($dir)
    {
        if($this->loaded) {
            return rename($this->tmpFile, $dir);
        }
        return false;
    }

    private function getStat($url)
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_NOBODY, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        $data = curl_exec($ch);
        curl_close($ch);
        if ($data === false) {
            return;
        }
        return $data;
    }
}
Последний раз редактировалось BalykhinAS 2018.02.27, 14:33, всего редактировалось 12 раз.
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Загрузка файлов по ссылке

Сообщение BalykhinAS »

по вашему это стандартное решение yii? Может заодно ссылку дадите на штатную валидацию загруженных файлов, на php.net такого нет?
Ответить