Created
December 14, 2015 19:54
-
-
Save tnightingale/c2b3f58311ec02a72079 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php require_once __DIR__.'/../vendor/autoload.php'; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\Response; | |
use Symfony\Component\HttpFoundation\File\UploadedFile; | |
use Silex\Application; | |
$app = new Application(); | |
$app['debug'] = true; | |
$upload_dir = "../files"; | |
$app->get('/are you there', function (Request $request) { | |
return new Response('<pre>[file server] Yes...</pre>'); | |
}); | |
/** | |
* Returns file if exists, 404 if not. | |
*/ | |
$app->get('/{filename}', function (Request $request, $filename) use ($app, $upload_dir) { | |
return $app->sendFile("{$upload_dir}/{$filename}"); | |
}); | |
/** | |
* File upload end point, writes files to file system if they don't exist. | |
*/ | |
$app->post('/upload', function (Request $request) use ($app, $upload_dir) { | |
$code = Response::HTTP_OK; // 200; | |
$body = [ | |
'error' => 'none', | |
'message' => 'Upload complete', | |
'files' => [], | |
]; | |
// First check all files for conflicts. | |
foreach ($request->files as $file) { | |
$filename = getFilename($file); | |
if (file_exists("{$upload_dir}/{$filename}")) { | |
$code = Response::HTTP_CONFLICT; // 409; | |
$body['error'] = 'conflict'; | |
$body['message'] = 'File already exists'; | |
$body['files'][] = $filename; | |
} | |
} | |
if ($code === Response::HTTP_OK) { | |
// No conflicts: safe to save files. | |
foreach ($request->files as $file) { | |
$filename = getFilename($file); | |
$file->move($upload_dir, $filename); | |
$body['files'][] = $filename; | |
} | |
} | |
error_log(print_r($request->files, 1) . "\n" . print_r($body, 1)); | |
return new Response('', $code); | |
// TODO: Not bothering returning JSON, status code should be sufficient. | |
// return $app->json($body, $code); | |
}); | |
// Respond to OPTIONS requests for CORS, Apache sets the headers (via .htaccess). | |
$app->options('/{uuid}', function (Request $request) { return new Response(); }); | |
$app->options('/upload', function (Request $request) { return new Response(); }); | |
$app->run(); | |
function getFilename(UploadedFile $file) { | |
// TODO: Handle filename & extension sanitization / rejection. | |
$fileName = $file->getClientOriginalName(); | |
return $fileName; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment