-
Notifications
You must be signed in to change notification settings - Fork 20
/
updateCabinetFile.php
216 lines (180 loc) · 7.7 KB
/
updateCabinetFile.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
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
<?php
require_once('config.php');
require_once('util.php');
require_once('class/cabinetUpdateFileSetting.php');
require_once('class/cabinetUploadFileInfo.php');
ini_set('xdebug.var_display_max_children', -1);
ini_set('xdebug.var_display_max_data', -1);
ini_set('xdebug.var_display_max_depth', -1);
/***
* 画像情報のセット
* */
// 送信したいファイルの情報設定
$cabinetUploadFileInfo = new CabinetUploadFileInfo(__DIR__ . '/image/test_image.jpg'); // 送信したいファイルの絶対パスを指定
// NOTE: $cabinetUploadFileInfo->extensionがnullの場合対応していない拡張子のファイルなのでエラーを起こした方が良い
// var_dump($cabinetUploadFileInfo);
// 画像の名前やパスなど
$cabinetUpdateFileSetting = new CabinetUpdateFileSetting();
$cabinetUpdateFileSetting->fileName = 'test_' . randomStr(3) . '_' . date_format(new DateTime('now', new DateTimeZone('Asia/Tokyo')), 'YmdHis');
$cabinetUpdateFileSetting->fileId = 87570458; // 更新したいファイルのファイルID cabinet.files.search などで取得できる
$cabinetUpdateFileSetting->filePath = basename($cabinetUploadFileInfo->filePath); // 拡張子つける 送信する実ファイルの名前を正確に
// 楽天へRMS APIを使って画像アップロード
list($reqXml, $httpStatusCode, $response) = cabinetFileUpdate($cabinetUpdateFileSetting, $cabinetUploadFileInfo);
//////////////// 関数群 ////////////////////
/*
* APIのリクエストを行う
* xmlを作って file_get_contentsでpostしてる
* @param $cabinetUpdateFileSetting 更新したい画像設定のクラスオブジェクト
* @param $cabinetUploadFileInfo 更新したい画像ファイルのオブジェクト
* @return リクエストしたxml文字列, httpステータスコード, レスポンス文字列(xmlで返ってくる)
*/
function cabinetFileUpdate($cabinetUpdateFileSetting, $cabinetUploadFileInfo) {
$authkey = base64_encode(RMS_SERVICE_SECRET . ':' . RMS_LICENSE_KEY);
$url = RMS_API_CABINET_FILE_UPDATE;
$reqXml = _createRequestXml($cabinetUpdateFileSetting);
$cabinetUploadFileInfoArray = array(
'file' => $cabinetUploadFileInfo //アップロードするファイルのCabinetUploadFileInfoオブジェクトを渡す
);
$params = array(
'xml' => $reqXml
);
list($response,$httpStatusCode) = httpPost($url, $params, $cabinetUploadFileInfoArray);
return array($reqXml, $httpStatusCode, $response);
}
/***
* 指定したURLに指定したパラメータのリクエストとファイルアップロードのPOSTを行う
*
* @param $url POSTするURL $params リクエストパラメーター $cabinetUploadFileInfoArray CabinetUploadFileInfoオブジェクト
*
* */
function httpPost($url, $params, $cabinetUploadFileInfoArray = []){
$isMultipart = (count($cabinetUploadFileInfoArray)) ? true : false;
$authkey = base64_encode(RMS_SERVICE_SECRET . ':' . RMS_LICENSE_KEY);
if ($isMultipart){
//ファイルアップロードを伴う場合、multipartで送信
$boundary = md5(mt_rand() . microtime());
$contentType = "Content-Type: multipart/form-data; boundary=\"$boundary\"";
$data = '';
foreach($params as $key => $value) {
$data .= "--$boundary" . "\r\n";
$data .= 'Content-Disposition: form-data; name=' . '"'. $key . '"' . "\r\n" . "\r\n";
$data .= $value . "\r\n";
}
foreach($cabinetUploadFileInfoArray as $key => $cabinetUploadFileInfo) {
$data .= "--$boundary" . "\r\n";
$data .= sprintf('Content-Disposition: form-data; name="%s"; filename="%s"%s', $key, basename($cabinetUploadFileInfo->filePath), "\r\n");
$data .= 'Content-Type: '. $cabinetUploadFileInfo->mimeType . "\r\n" . "\r\n";
$data .= file_get_contents($cabinetUploadFileInfo->filePath) . "\r\n";
}
$data .= "--$boundary--";
} else {
//パラメータのみを送信
$contentType = 'Content-Type: application/x-www-form-urlencoded';
$data = http_build_query($params);
}
$headers = array(
"Connection: keep-alive",
"Proxy-Connection: keep-alive",
$contentType,
'Content-Length: '.strlen($data),
"Authorization: ESA {$authkey}",
"Accept: */*",
// "Accept-Encoding: gzip,deflate",
// "Accept-Language: ja,en-US;q=0.8,en;q=0.6"
);
$header = implode("\r\n", $headers);
// customVarDump($header);
// customVarDump($data);
$options = array('http' => array(
'method' => 'POST',
'ignore_errors' => true, //trueにすると40x,50x系のエラーでも内容を取得できる。
'content' => $data,
'header' => $header
));
$response = file_get_contents($url, false, stream_context_create($options));
$httpResponseHeader = implode("\r\n", $http_response_header);
$httpStatusCode = extract_response_http_code($httpResponseHeader);
return array($response, $httpStatusCode);
}
/*
* 渡したclassオブジェクトからリクエストのXMLを自動生成する
* 注意. xmlの要素の順番を変えると400でwrong formatエラーが返却されるクソ仕様。
* cabinet.file.getでxmlの要素の順番を確認しながら行うと無難(API仕様書でも良いが間違ってないという保証はない)
*/
function _createRequestXml($cabinetFile) {
// リクエストXMLのガワを作る
$rootXml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><request/>');
$fileInsertRequestXml = $rootXml->addChild('fileUpdateRequest');
$fileXml = $fileInsertRequestXml->addChild('file');
// 受け取った商品情報オブジェクトをarrayに変換
$array = _convertClassObjectToArray($cabinetFile);
_arrayToXml($array, $fileXml); // リクエストのXMLをarray情報から作成する
return $rootXml->asXML(); // リクエストのXMLを返却する
}
/**
* Convert an array to XML
* @param array $array
* @param SimpleXMLElement $xml
* @param array $parentKeyName (その要素が配列で、子要素を親要素の単数形にして登録したい時指定)
*/
function _arrayToXml($array, &$xml, $parentKeyName=null){
foreach ($array as $key => $value) {
if(is_array($value)){
if(is_int($key)){
if(!empty($parentKeyName)) {
// 親要素が存在する時、子要素を親要素の単数形の名前にして登録
$key = singularByPlural($parentKeyName);
}
}
$label = $xml->addChild($key);
_arrayToXml($value, $label, $key);
}
else if(!is_null($value)){
// 値がセットされている時だけxml要素に追加
$xml->addChild($key, $value);
}
}
}
/**
* Convert an classObject to array
*/
function _convertClassObjectToArray($object) {
$json = json_encode($object);
return (array)json_decode($json, true);
}
//////////////// 結果をブラウザで表示 ////////////////////
?>
<!DOCTYPE html>
<html>
<head>
<title>cabinet.file.update | CabinetAPI</title>
<meta charset="UTF-8">
<style>
pre,code {
width:100%;
overflow: auto;
white-space: pre-wrap;
word-wrap: break-word;
}
</style>
</head>
<body>
<div style="width:100%;">
<h1>リクエスト</h1>
<pre>
<?php echo htmlspecialchars($reqXml, ENT_QUOTES);; ?>
</pre>
<h1>レスポンス結果</h1>
<h2>HTTP Status code</h2>
<pre>
<?php echo $httpStatusCode; ?>
</pre>
<h2>生レスポンス</h2>
<pre>
<?php
error_log(print_r($response, true));
echo htmlspecialchars(returnFormattedXmlString($response) , ENT_QUOTES); ?>
</pre>
</div>
</body>
</html>