-
Notifications
You must be signed in to change notification settings - Fork 62
/
UploadAction.php
102 lines (91 loc) · 3.49 KB
/
UploadAction.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
namespace budyaga\cropper\actions;
use yii\base\Action;
use yii\base\DynamicModel;
use yii\base\InvalidConfigException;
use yii\web\BadRequestHttpException;
use yii\web\Response;
use yii\web\UploadedFile;
use budyaga\cropper\Widget;
use yii\imagine\Image;
use Imagine\Image\Box;
use Yii;
class UploadAction extends Action
{
public $path;
public $url;
public $uploadParam = 'file';
public $maxSize = 2097152;
public $extensions = 'jpeg, jpg, png, gif';
public $width = 200;
public $height = 200;
/**
* @inheritdoc
*/
public function init()
{
Widget::registerTranslations();
if ($this->url === null) {
throw new InvalidConfigException(Yii::t('cropper', 'MISSING_ATTRIBUTE', ['attribute' => 'url']));
} else {
$this->url = rtrim($this->url, '/') . '/';
}
if ($this->path === null) {
throw new InvalidConfigException(Yii::t('cropper', 'MISSING_ATTRIBUTE', ['attribute' => 'path']));
} else {
$this->path = rtrim(Yii::getAlias($this->path), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
}
}
/**
* @inheritdoc
*/
public function run()
{
if (Yii::$app->request->isPost) {
$file = UploadedFile::getInstanceByName($this->uploadParam);
$model = new DynamicModel(compact($this->uploadParam));
$model->addRule($this->uploadParam, 'image', [
'maxSize' => $this->maxSize,
'tooBig' => Yii::t('cropper', 'TOO_BIG_ERROR', ['size' => $this->maxSize / (1024 * 1024)]),
'extensions' => explode(', ', $this->extensions),
'wrongExtension' => Yii::t('cropper', 'EXTENSION_ERROR', ['formats' => $this->extensions])
])->validate();
if ($model->hasErrors()) {
$result = [
'error' => $model->getFirstError($this->uploadParam)
];
} else {
$model->{$this->uploadParam}->name = uniqid() . '.' . $model->{$this->uploadParam}->extension;
$request = Yii::$app->request;
$width = $request->post('width', $this->width);
$height = $request->post('height', $this->height);
$image = Image::crop(
$file->tempName . $request->post('filename'),
intval($request->post('w')),
intval($request->post('h')),
[$request->post('x'), $request->post('y')]
)->resize(
new Box($width, $height)
);
if (!file_exists($this->path) || !is_dir($this->path)) {
$result = [
'error' => Yii::t('cropper', 'ERROR_NO_SAVE_DIR')]
;
}
if ($image->save($this->path . $model->{$this->uploadParam}->name), ['jpeg_quality' => 100, 'png_compression_level' => 1]) {
$result = [
'filelink' => $this->url . $model->{$this->uploadParam}->name
];
} else {
$result = [
'error' => Yii::t('cropper', 'ERROR_CAN_NOT_UPLOAD_FILE')]
;
}
}
Yii::$app->response->format = Response::FORMAT_JSON;
return $result;
} else {
throw new BadRequestHttpException(Yii::t('cropper', 'ONLY_POST_REQUEST'));
}
}
}