<?php namespace App\Http\Controllers; use App\Traits\Filepond; use Illuminate\Http\Request; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Response; class FilepondController extends Controller { use Filepond; public function upload(Request $request) { $file = $request->file('file'); if (is_array($file)) { // dd('files'); $path = []; foreach ($file as $item) { $filePath = $this->getBasePath() . '/upload/' . saasDomain() . '/' . uniqid(); if (!File::isDirectory($filePath)) { File::makeDirectory($filePath, 0777, true, true); } if ($item) { $name = $item->getClientOriginalName(); if ($item->move($filePath, $name)) { $path[] = $this->getServerIdFromPath($filePath); } } } return $path; } else { // dd('single file'); $filePath = $this->getBasePath() . '/upload/' . saasDomain() . '/' . uniqid(); if (!File::isDirectory($filePath)) { File::makeDirectory($filePath, 0777, true, true); } if ($file) { $name = $file->getClientOriginalName(); if (!$file->move($filePath, $name)) { return Response::make('Could not save file', 500); } } return Response::make($this->getServerIdFromPath($filePath), 200); } } /** * @param Request $request * @return \Illuminate\Http\Response|int */ public function chunk(Request $request) { error_reporting(E_ERROR); $id = $request->get('patch'); // location of patch files $filePath = $this->getPathFromServerId($id); $fileName = $_SERVER['HTTP_UPLOAD_NAME']; $dir = $filePath . '/' . $fileName; // get patch data $offset = $_SERVER['HTTP_UPLOAD_OFFSET']; $length = $_SERVER['HTTP_UPLOAD_LENGTH']; // should be numeric values, else exit if (!is_numeric($offset) || !is_numeric($length)) { return http_response_code(400); } // get sanitized name // write patch file for this request file_put_contents($dir . '.patch.' . $offset, fopen('php://input', 'rb')); // calculate total size of patches $size = 0; $patch = glob($dir . '.patch.*'); foreach ($patch as $filename) { $size += filesize($filename); } // if total size equals length of file we have gathered all patch files if ($size == $length) { // create output file $file_handle = fopen($dir, 'wb'); // write patches to file foreach ($patch as $filename) { // get offset from filename list($dir, $offset) = explode('.patch.', $filename, 2); // read patch and close $patch_handle = fopen($filename, 'rb'); $patch_contents = fread($patch_handle, filesize($filename)); fclose($patch_handle); // apply patch fseek($file_handle, $offset); fwrite($file_handle, $patch_contents); } // remove patches foreach ($patch as $filename) { unlink($filename); } // done with file fclose($file_handle); } return Response::make('', 204); } /** * Takes the given encrypted filepath and deletes * it if it hasn't been tampered with * * @param Request $request * @return mixed */ public function delete(Request $request) { $filePath = $this->getPathFromServerId($request->getContent()); if (File::deleteDirectory($filePath)) { return Response::make('', 200); } else { return Response::make('', 500); } } }