Загрузка файлов по ссылке
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Загрузка файлов по ссылке
дико извеняюсь но не нашел стандартного решения загрузки файлов не через POST форму а по ссылке. есть такие методы?
Re: Загрузка файлов по ссылке
Я делал так
во вьюхе
Код: Выделить всё
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);
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Re: Загрузка файлов по ссылке
этот пример отдает пользователю файл?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);
Мне необходимо загружать файл на сервер по ссылке с валидациями
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Re: Загрузка файлов по ссылке
что то вроде
Код: Выделить всё
$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 раз.
-
- Сообщения: 179
- Зарегистрирован: 2018.02.05, 13:41
- Контактная информация:
Re: Загрузка файлов по ссылке
по вашему это стандартное решение yii? Может заодно ссылку дадите на штатную валидацию загруженных файлов, на php.net такого нет?shnir писал(а): ↑2018.02.27, 11:59 http://php.net/manual/ru/function.file-get-contents.php
или
http://php.net/manual/ru/book.curl.php