UploadService.php
7.6 KB
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
<?php
namespace App\Services;
use App\Helper\FileEtag;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Illuminate\Http\UploadedFile;
/**
* Class UploadServer
* @package App\Services
*/
class UploadService extends BaseService
{
/**
* 默认配置
* @see $defaultConfig
* @var array
*/
public $config = [];
/**
* 默认配置
* @var array
*/
public $defaultConfig = [
// 上传文件的大小范围
'size' => [
'max' => 1024 * 1024 * 2, // 2M
],
// 磁盘
'disk' => 'upload',
// 扩展名
'ext' => [
'png', 'jpg', 'jpeg', 'gif'
],
// 目录
'path' => '',
];
/**
* @param string|array $config
* @author:dc
* @time 2022/1/7 14:38
*/
private function config($config = 'default')
{
if (is_array($config)) {
$driver = $config['driver'];
} else {
$driver = $config;
}
// 加载配置
$this->config = $this->defaultConfig;
if ($driver != 'default') {
$conf = config('upload.' . $driver);
if ($conf) {
// 合并默认配置
$this->config = array_merge($this->config, $conf);
}
}
// 追加目录
if ($config['path'] ?? '') {
$this->config['path'] = $this->config['path'] . (strpos($config['path'], '/') !== 0 ? '/' : '') . $config['path'];
}
}
/**
*
* @param string $input_file
* @param string $config
* @return string
* @throws \Exception
* @author:dc
* @time 2021/12/30 16:37
*/
public function put($input_file = "file", $config = 'default'): string
{
$this->config($config);
if ($input_file instanceof UploadedFile) {
$file = &$input_file;
} else {
// 是否是已存在服务器的图片
if (Str::contains($input_file, env('APP_URL'))) {
return $input_file;
} else {
// 获取post上传文件
$file = request()->file($input_file);
// 如果不是上传,是否本地文件
if (!$file && is_file($input_file)) {
// 获取文件的名字
$origin_name = explode(DIRECTORY_SEPARATOR, $input_file);
!is_array($origin_name) && $origin_name = [$origin_name];
// 创建一个上传对象
$file = UploadedFile::createFromBase(new \Symfony\Component\HttpFoundation\File\UploadedFile($input_file, array_pop($origin_name)));
}
}
}
if ($file) {
// 验证扩展名
if (!in_array($file->extension(), $this->config['ext'])) {
$this->fail('文件扩展名不匹配,文件扩展名支持' . implode(',', $this->config['ext']));
}
// 验证文件大小
if ($file->getSize() > $this->config['size']['max']) {
$this->fail('文件大小超出' . ($this->config['size']['max'] / 1024 / 1024) . 'M');
}
//判断文件hash是否已存在
if ($filename = $this->getFileHash($file)) {
return $filename;
}
$pathDate = date('Y-m');
// 保存处理过的图片
if (!empty($img)) {
// 保存的图片名称
$save_name = $this->config['path'] . '/' . $pathDate . '/' . $file->hashName();
// 保存文件
if (!Storage::disk($this->config['disk'])
->put($save_name, $img->getEncoded())) {
$save_name = '';
}
} else {
// 保存文件
$save_name = $file->storeAs($this->config['path'] . '/' . $pathDate, $file->hashName(), $this->config['disk']);
}
if ($save_name) {
//保存文件hash
$this->setFileHash($file, $save_name);
// 返回地址
return $save_name;
}
$this->fail( '上传失败');
}
// 异常
$this->fail('请上传文件');
}
/**
* 批量上传
* @param string $input_file
* @param string $config
* @return array
* @throws \Exception
* @author:dc
* @time 2021/12/30 16:36
*/
public function puts($input_file = "file", $config = 'default'): array
{
$request = request();
$files = $request->post($input_file, []);
$files_ = $request->file($input_file);
if ($files_) {
$files = array_merge($files, $files_);
}
$filename = [];
if ($files instanceof UploadedFile) {
$filename[] = $this->put($files, $config);
} else if ($files) {
foreach ($files as $file) {
$filename[] = $this->put($file, $config);
}
} else {
// 异常
$this->fail('请上传文件');
}
return $filename;
}
/**
* 上传文件,文件内容
* @param string $filename
* @param string $content
* @param string $config
* @return string
* @throws \App\Exceptions\BsideGlobalException
* @author:dc
* @time 2022/1/7 14:45
*/
public function filePut(string $filename, string $content, $config = 'default')
{
if ($content) {
$this->config($config);
$save_name = $this->config['path'] . '/' . $filename;
// 保存文件
$result = Storage::disk($this->config['disk'])->put($save_name, $content);
if ($result) {
// 返回地址
return $save_name;
}
$this->fail('上传失败');
}
// 异常
$this->fail('请上传文件');
}
/**
* 文件hash是否存在 存在返回文件路径
* @param $file
* @return mixed|string|null
*/
protected function getFileHash($file)
{
$hash = FileEtag::sum($file)[0];
if (!$hash) {
return '';
}
return DB::table('gl_file_hash')->where('hash', $hash)->value('filename');
}
/**
* 保存文件hash
* @param $file
* @param $save_path
* @return bool
*/
protected function setFileHash($file, $save_path): bool
{
$hash = FileEtag::sum($file)[0];
if (!$hash) {
return false;
}
$data = [
'filename' => $save_path,
'hash' => $hash,
];
DB::table('gl_file_hash')->insert($data);
return true;
}
/**
* 文件地址转本地路径
* @param $url
* @return array|string|string[]
* @author zbj
* @date 2023/4/20
*/
public function url2path($url){
$this->config();
$upload_url = config('filesystems')['disks'][$this->config['disk']]['url'];
return str_replace($upload_url . '/', '', $url);
}
/**
* 本地路径转链接
* @param $path
* @return string
* @author zbj
* @date 2023/4/20
*/
public function path2url($path){
$this->config();
return Storage::disk($this->config['disk'])->url($path);
}
/**
* 文件列表
* @return array
* @author:dc
* @time 2023/5/29 11:49
*/
public function lists($config){
$this->config($config);
return Storage::disk($this->config['disk'])->allFiles();
}
}