1 | <?php |
||
2 | |||
3 | namespace Qiniu\Storage; |
||
4 | |||
5 | use Qiniu\Config; |
||
6 | use Qiniu\Http\Error; |
||
7 | use Qiniu\Http\Client; |
||
8 | use Qiniu\Http\RequestOptions; |
||
9 | |||
10 | final class FormUploader |
||
11 | { |
||
12 | |||
13 | /** |
||
14 | * 上传二进制流到七牛, 内部使用 |
||
15 | * |
||
16 | * @param string $upToken 上传凭证 |
||
17 | * @param string $key 上传文件名 |
||
18 | * @param string $data 上传二进制流 |
||
19 | * @param Config $config 上传配置 |
||
20 | * @param string $params 自定义变量,规格参考 |
||
21 | * {@link https://developer.qiniu.com/kodo/manual/1235/vars#xvar} |
||
22 | * @param string $mime 上传数据的mimeType |
||
23 | * @param string $fname |
||
24 | * @param RequestOptions $reqOpt |
||
25 | * |
||
26 | * @return array 包含已上传文件的信息,类似: |
||
27 | 9 | * [ |
|
28 | * "hash" => "<Hash string>", |
||
29 | * "key" => "<Key string>" |
||
30 | * ] |
||
31 | */ |
||
32 | public static function put( |
||
33 | $upToken, |
||
34 | $key, |
||
35 | $data, |
||
36 | 9 | $config, |
|
37 | 9 | $params, |
|
38 | $mime, |
||
39 | 9 | $fname, |
|
40 | $reqOpt = null |
||
41 | ) { |
||
42 | if ($reqOpt == null) { |
||
43 | 9 | $reqOpt = new RequestOptions(); |
|
44 | } |
||
45 | 9 | $fields = array('token' => $upToken); |
|
46 | if ($key === null) { |
||
0 ignored issues
–
show
introduced
by
Loading history...
|
|||
47 | } else { |
||
48 | $fields['key'] = $key; |
||
49 | } |
||
50 | |||
51 | 9 | //enable crc32 check by default |
|
52 | 9 | $fields['crc32'] = \Qiniu\crc32_data($data); |
|
53 | |||
54 | if ($params) { |
||
55 | foreach ($params as $k => $v) { |
||
0 ignored issues
–
show
|
|||
56 | 9 | $fields[$k] = $v; |
|
57 | } |
||
58 | 9 | } |
|
59 | 9 | ||
60 | list($accessKey, $bucket, $err) = \Qiniu\explodeUpToken($upToken); |
||
61 | if ($err != null) { |
||
62 | 9 | return array(null, $err); |
|
63 | } |
||
64 | |||
65 | list($upHost, $err) = $config->getUpHostV2($accessKey, $bucket, $reqOpt); |
||
66 | if ($err != null) { |
||
67 | return array(null, $err); |
||
68 | } |
||
69 | |||
70 | |||
71 | $response = Client::multipartPost( |
||
72 | $upHost, |
||
73 | $fields, |
||
74 | 'file', |
||
75 | $fname, |
||
76 | $data, |
||
77 | $mime, |
||
78 | array(), |
||
79 | $reqOpt |
||
80 | ); |
||
81 | if (!$response->ok()) { |
||
82 | 3 | return array(null, new Error($upHost, $response)); |
|
83 | } |
||
84 | return array($response->json(), null); |
||
85 | } |
||
86 | |||
87 | /** |
||
88 | * 上传文件到七牛,内部使用 |
||
89 | * |
||
90 | * @param string $upToken 上传凭证 |
||
91 | * @param string $key 上传文件名 |
||
92 | 3 | * @param string $filePath 上传文件的路径 |
|
93 | 3 | * @param Config $config 上传配置 |
|
94 | 3 | * @param string $params 自定义变量,规格参考 |
|
95 | 3 | * https://developer.qiniu.com/kodo/manual/1235/vars#xvar |
|
96 | * @param string $mime 上传数据的mimeType |
||
97 | 3 | * |
|
98 | * @return array 包含已上传文件的信息,类似: |
||
99 | 3 | * [ |
|
100 | * "hash" => "<Hash string>", |
||
101 | * "key" => "<Key string>" |
||
102 | * ] |
||
103 | */ |
||
104 | 3 | public static function putFile( |
|
105 | 3 | $upToken, |
|
106 | $key, |
||
107 | 3 | $filePath, |
|
108 | 3 | $config, |
|
109 | $params, |
||
110 | $mime, |
||
111 | $reqOpt = null |
||
112 | 3 | ) { |
|
113 | if ($reqOpt == null) { |
||
114 | 3 | $reqOpt = new RequestOptions(); |
|
115 | 3 | } |
|
116 | |||
117 | $fields = array('token' => $upToken, 'file' => self::createFile($filePath, $mime)); |
||
118 | 3 | if ($key !== null) { |
|
0 ignored issues
–
show
|
|||
119 | $fields['key'] = $key; |
||
120 | } |
||
121 | 3 | ||
122 | $fields['crc32'] = \Qiniu\crc32_file($filePath); |
||
123 | |||
124 | if ($params) { |
||
125 | 3 | foreach ($params as $k => $v) { |
|
0 ignored issues
–
show
|
|||
126 | 2 | $fields[$k] = $v; |
|
127 | } |
||
128 | } |
||
129 | $fields['key'] = $key; |
||
130 | 1 | $headers = array('Content-Type' => 'multipart/form-data'); |
|
131 | 1 | ||
132 | 1 | list($accessKey, $bucket, $err) = \Qiniu\explodeUpToken($upToken); |
|
133 | 1 | if ($err != null) { |
|
134 | return array(null, $err); |
||
135 | 1 | } |
|
136 | |||
137 | list($upHost, $err) = $config->getUpHostV2($accessKey, $bucket, $reqOpt); |
||
138 | if ($err != null) { |
||
139 | return array(null, $err); |
||
140 | } |
||
141 | |||
142 | $response = Client::post($upHost, $fields, $headers, $reqOpt); |
||
143 | if (!$response->ok()) { |
||
144 | return array(null, new Error($upHost, $response)); |
||
145 | } |
||
146 | return array($response->json(), null); |
||
147 | } |
||
148 | |||
149 | private static function createFile($filename, $mime) |
||
150 | { |
||
151 | // PHP 5.5 introduced a CurlFile object that deprecates the old @filename syntax |
||
152 | // See: https://wiki.php.net/rfc/curl-file-upload |
||
153 | if (function_exists('curl_file_create')) { |
||
154 | return curl_file_create($filename, $mime); |
||
155 | } |
||
156 | |||
157 | // Use the old style if using an older version of PHP |
||
158 | $value = "@{$filename}"; |
||
159 | if (!empty($mime)) { |
||
160 | $value .= ';type=' . $mime; |
||
161 | } |
||
162 | |||
163 | return $value; |
||
164 | } |
||
165 | } |
||
166 |