Skip to content

Instantly share code, notes, and snippets.

@tnightingale
Created December 14, 2015 19:54
Show Gist options
  • Save tnightingale/c2b3f58311ec02a72079 to your computer and use it in GitHub Desktop.
Save tnightingale/c2b3f58311ec02a72079 to your computer and use it in GitHub Desktop.
<?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