Skip to content

Commit db97c75

Browse files
committed
Implement file upload
1 parent d0d94ba commit db97c75

File tree

4 files changed

+67
-5
lines changed

4 files changed

+67
-5
lines changed

api.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3182,6 +3182,32 @@ public function handle(Request $request): Response
31823182
}
31833183
}
31843184

3185+
// file: src/Tqdev/PhpCrudApi/Middleware/FileUploadMiddleware.php
3186+
3187+
class FileUploadMiddleware extends Middleware
3188+
{
3189+
public function handle(Request $request): Response
3190+
{
3191+
$files = $request->getUploadedFiles();
3192+
if (!empty($files)) {
3193+
$body = $request->getBody();
3194+
foreach ($files as $fieldName => $file) {
3195+
if (isset($file['error'])) {
3196+
return $this->responder->error(ErrorCode::FILE_UPLOAD_FAILED, $fieldName);
3197+
}
3198+
foreach ($file as $key => $value) {
3199+
if ($key == 'tmp_nam') {
3200+
$value = base64_encode(file_get_contents($value));
3201+
}
3202+
$body[$fieldName . '_' . $key] = $value;
3203+
}
3204+
}
3205+
$request->setBody($body);
3206+
}
3207+
return $this->next->handle($request);
3208+
}
3209+
}
3210+
31853211
// file: src/Tqdev/PhpCrudApi/Middleware/FirewallMiddleware.php
31863212

31873213
class FirewallMiddleware extends Middleware
@@ -4244,6 +4270,7 @@ class ErrorCode
42444270
const TEMPORARY_OR_PERMANENTLY_BLOCKED = 1016;
42454271
const BAD_OR_MISSING_XSRF_TOKEN = 1017;
42464272
const ONLY_AJAX_REQUESTS_ALLOWED = 1018;
4273+
const FILE_UPLOAD_FAILED = 1019;
42474274

42484275
private $values = [
42494276
9999 => ["%s", Response::INTERNAL_SERVER_ERROR],
@@ -4266,6 +4293,7 @@ class ErrorCode
42664293
1016 => ["Temporary or permanently blocked", Response::FORBIDDEN],
42674294
1017 => ["Bad or missing XSRF token", Response::FORBIDDEN],
42684295
1018 => ["Only AJAX requests allowed for '%s'", Response::FORBIDDEN],
4296+
1019 => ["File upload failed for '%s'", Response::UNPROCESSABLE_ENTITY],
42694297
];
42704298

42714299
public function __construct(int $code)

examples/clients/auth0/vanilla.html

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22
<head>
33
<meta charset="utf-8" />
44
<script>
5-
var domain = ''; // hostname ending in '.auth0.com'
6-
var clientId = ''; // client id as defined in auth0
7-
var audience = ''; // api audience as defined in auth0
5+
//var domain = ''; // hostname ending in '.auth0.com'
6+
//var authUrl = 'https://'+domain+'/authorize';
7+
var authUrl = 'http://127.0.0.2/authorize.php'
8+
var clientId = 'default'; // client id as defined in auth0
9+
var audience = 'http://127.0.0.3/api.php'; // api audience as defined in auth0
810
window.onload = function () {
911
var match = RegExp('[#&]access_token=([^&]*)').exec(window.location.hash);
1012
var accessToken = match && decodeURIComponent(match[1].replace(/\+/g, ' '));
1113
if (!accessToken) {
12-
document.location = 'https://'+domain+'/authorize?audience='+audience+'&response_type=token&client_id='+clientId+'&redirect_uri='+document.location.href;
14+
document.location = authUrl+'?audience='+audience+'&response_type=token&client_id='+clientId+'&redirect_uri='+document.location.href;
1315
} else {
1416
document.location.hash = '';
1517
var req = new XMLHttpRequest();
@@ -19,7 +21,7 @@
1921
document.getElementById('output').innerHTML = JSON.stringify(JSON.parse(req.responseText), undefined, 4);
2022
}
2123
}
22-
url = '/api.php/records/posts?join=categories&join=tags&join=comments&filter=id,eq,1';
24+
url = 'http://127.0.0.3/api.php/records/posts?join=categories&join=tags&join=comments&filter=id,eq,1';
2325
req.open("GET", url, true);
2426
req.setRequestHeader('X-Authorization', 'Bearer '+accessToken);
2527
req.send();
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
namespace Tqdev\PhpCrudApi\Middleware;
3+
4+
use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
5+
use Tqdev\PhpCrudApi\Request;
6+
use Tqdev\PhpCrudApi\Response;
7+
8+
class FileUploadMiddleware extends Middleware
9+
{
10+
public function handle(Request $request): Response
11+
{
12+
$files = $request->getUploadedFiles();
13+
if (!empty($files)) {
14+
$body = $request->getBody();
15+
foreach ($files as $fieldName => $file) {
16+
if (isset($file['error'])) {
17+
return $this->responder->error(ErrorCode::FILE_UPLOAD_FAILED, $fieldName);
18+
}
19+
foreach ($file as $key => $value) {
20+
if ($key == 'tmp_nam') {
21+
$value = base64_encode(file_get_contents($value));
22+
}
23+
$body[$fieldName . '_' . $key] = $value;
24+
}
25+
}
26+
$request->setBody($body);
27+
}
28+
return $this->next->handle($request);
29+
}
30+
}

src/Tqdev/PhpCrudApi/Record/ErrorCode.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class ErrorCode
3030
const TEMPORARY_OR_PERMANENTLY_BLOCKED = 1016;
3131
const BAD_OR_MISSING_XSRF_TOKEN = 1017;
3232
const ONLY_AJAX_REQUESTS_ALLOWED = 1018;
33+
const FILE_UPLOAD_FAILED = 1019;
3334

3435
private $values = [
3536
9999 => ["%s", Response::INTERNAL_SERVER_ERROR],
@@ -52,6 +53,7 @@ class ErrorCode
5253
1016 => ["Temporary or permanently blocked", Response::FORBIDDEN],
5354
1017 => ["Bad or missing XSRF token", Response::FORBIDDEN],
5455
1018 => ["Only AJAX requests allowed for '%s'", Response::FORBIDDEN],
56+
1019 => ["File upload failed for '%s'", Response::UNPROCESSABLE_ENTITY],
5557
];
5658

5759
public function __construct(int $code)

0 commit comments

Comments
 (0)