1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace CRUDlex;
13:
14: use Symfony\Component\HttpFoundation\Request;
15: use Symfony\Component\HttpFoundation\Response;
16: use Symfony\Component\HttpFoundation\StreamedResponse;
17:
18: use CRUDlex\CRUDFileProcessorInterface;
19: use CRUDlex\CRUDEntity;
20:
21: class CRUDSimpleFilesystemFileProcessor implements CRUDFileProcessorInterface {
22:
23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
37: protected function getPath($entityName, CRUDEntity $entity, $field) {
38: return $entity->getDefinition()->getFilePath($field).'/'.$entityName.'/'.$entity->get('id').'/'.$field;
39: }
40:
41: 42: 43:
44: public function createFile(Request $request, CRUDEntity $entity, $entityName, $field) {
45: $file = $request->files->get($field);
46: if ($file) {
47: $targetPath = $this->getPath($entityName, $entity, $field);
48: if (!file_exists($targetPath)) {
49: mkdir($targetPath, 0777, true);
50: }
51: $file->move($targetPath, $file->getClientOriginalName());
52: }
53: }
54:
55: 56: 57: 58:
59: public function updateFile(Request $request, CRUDEntity $entity, $entityName, $field) {
60:
61: $this->createFile($request, $entity, $entityName, $field);
62: }
63:
64: 65: 66: 67:
68: public function deleteFile(CRUDEntity $entity, $entityName, $field) {
69:
70: 71: 72: 73: 74: 75: 76: 77:
78: }
79:
80: 81: 82:
83: public function renderFile(CRUDEntity $entity, $entityName, $field) {
84: $targetPath = $this->getPath($entityName, $entity, $field);
85: $fileName = $entity->get($field);
86: $file = $targetPath.'/'.$fileName;
87: $response = new Response('');
88: $finfo = finfo_open(FILEINFO_MIME_TYPE);
89: $mimeType = finfo_file($finfo, $file);
90: finfo_close($finfo);
91: $size = filesize($file);
92: if ($fileName && file_exists($file)) {
93: $response = new StreamedResponse(function () use ($file) {
94: set_time_limit(0);
95: $handle = fopen($file,"rb");
96: if ($handle !== false) {
97: $chunkSize = 1024 * 1024;
98: while (!feof($handle)) {
99: $buffer = fread($handle, $chunkSize);
100: echo $buffer;
101: flush();
102: }
103: fclose($handle);
104: }
105: }, 200, array(
106: 'Content-Type' => $mimeType,
107: 'Content-Disposition' => 'attachment; filename="'.$fileName.'"',
108: 'Content-length' => $size
109: ));
110: $response->send();
111: }
112: return $response;
113: }
114: }
115: