d2d.emegrendeles.hu/app/Http/Controllers/Admin/FileBatchUploadController.php

358 lines
13 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Attachment;
use App\Models\Product;
use App\Models\Supplier;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Collection;
use Illuminate\View\View;
class FileBatchUploadController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(): View
{
$suppliers = Supplier::orderBy('name')->get(['id', 'name'])->toArray();
return view('admin.fileBatchController.index')->with(
[
'suppliers' => $suppliers,
'formUUID' => \Str::uuid(),
]
);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request): Response|JsonResponse
{
$functionName = 'client'.ucfirst($request->input('requestType'));
if (method_exists($this, $functionName)) {
return call_user_func([$this, $functionName], $request);
}
return response()->json([
'jsonrpc' => '2.0',
'request_param' => $request->all(),
'result' => null,
'id' => 'id',
], 200);
}
private array $responseJSON = [
'jsonrpc' => '2.0',
'result' => null,
'status' => 200,
];
private array $responseError = [];
private int $responseStatus = 200;
private function responseAddError(string $errorStr)
{
$this->responseError[] = $errorStr;
}
private function responseSetResultStatus(int $status)
{
$this->responseJSON['status'] = $status;
}
private function responseSetStatus(int $status)
{
$this->responseStatus = $status;
}
private function responseAddResult($data)
{
if (! $this->responseJSON['result']) {
$this->responseJSON['result'] = [];
}
$this->responseJSON['result'] = array_merge($this->responseJSON['result'], $data);
}
private function responseAddNewData($pointer, $data)
{
$this->responseJSON[$pointer] = $data;
}
private function responseMake($result = null, $errors = null, $status = null)
{
if ($errors) {
$this->responseError = array_merge($this->responseError, $errors);
}
if (count($this->responseError) > 0) {
$this->responseJSON['errors'] = $this->responseError;
$this->responseSetStatus(500);
}
if ($status) {
$this->responseSetStatus($status);
}
if ($result) {
if (! $this->responseJSON['result']) {
$this->responseJSON['result'] = $result;
} else {
$this->responseJSON['result'] = array_merge($this->responseJSON['result'], $result);
}
}
return response()->json($this->responseJSON, $this->responseStatus);
}
private function removeAttachment(Collection $attachments)
{
/** @var Attachment $attachment */
foreach ($attachments as $attachment) {
$attachment->removeFile();
$attachment->delete();
// dd($attachment->toArray());
}
}
private array $acceptedAttachmentType = ['picture', 'specification'];
private function clientFilesAttach(Request $request)
{
// sleep(30);
$this->responseAddNewData('function', lcfirst(str_replace('client', '', __FUNCTION__)));
if (! $supplier = Supplier::find($request->get('supplier'))) {
return $this->responseMake(null, ['Ismeretlen Beszállító']);
}
if (! $request->get('attachmentType') || ! in_array($request->get('attachmentType'), $this->acceptedAttachmentType)) {
return $this->responseMake(null, ['Ismeretlen csatolmány típus']);
}
$attachTypePointer = $request->get('attachmentType');
// $attachTypePointer='specification';
$attachTypeRelationPointer = $request->get('attachmentType').'s';
// sleep(2);
$fileNamesArray = json_decode($request->get('fileNames'));
foreach ($fileNamesArray as $i => $v) {
// print " $i $v".PHP_EOL;
$product = Product::with($attachTypePointer)->where('supplier_id', '=', $supplier->id)->where('supplierProductNumber', '=', pathinfo($v)['filename'])->get();
if (count($product) < 1) {
$this->responseAddResult([$i => ['name' => $v, 'status' => 'error', 'pid' => null, 'desc' => 'Nincs ilyen termék']]);
continue;
}
if (count($product) > 1) {
$this->responseAddResult([$i => ['name' => $v, 'status' => 'error', 'pid' => null, 'desc' => 'Több termék rendelkezik ezzel a cikkszámmal']]);
continue;
}
$product = $product->first();
$attachCount = count($product->{$attachTypePointer}()->get()->toArray());
if ($attachCount > 0) {
$this->removeAttachment($product->{$attachTypePointer}()->get());
}
/* $this->responseAddResult([$i=>['attachCount'=>$attachCount, 'name'=>$v,'status'=>'ok','pid'=>$product->id,'desc'=>$product->name]]);
continue;
dd($product->{$attachTypePointer}()->get()->toArray());*/
//$path = \Storage::disk('uploader')->getDriver()->getAdapter()->getPathPrefix();
$path = \Storage::disk('uploader')->path('');
$dir = $this->getTargetDirectory();
$file = pathinfo($v)['basename'];
$attachment = new Attachment;
$attachment->attachType = $request->get('attachmentType');
$FileObject = new UploadedFile($path.$dir.$file, $file);
$attachment->addFile($FileObject);
$attachment->attachable()->associate($product);
$attachment->save();
/**@todo:need remove file
*
*/
$this->responseAddResult([$i => ['name' => $v, 'status' => 'ok', 'pid' => $product->id, 'desc' => $product->name]]);
}
return $this->responseMake();
}
private function clientFilesAdded(Request $request)
{
$this->responseAddNewData('function', lcfirst(str_replace('client', '', __FUNCTION__)));
if (! $supplier = Supplier::find($request->get('supplier'))) {
return $this->responseMake(null, ['Ismeretlen Beszállító']);
}
if (! $request->get('attachmentType') || ! in_array($request->get('attachmentType'), $this->acceptedAttachmentType)) {
return $this->responseMake(null, ['Ismeretlen csatolmány típus']);
}
$fileNamesArray = json_decode($request->get('fileNames'));
foreach ($fileNamesArray as $i => $v) {
// print " $i $v".PHP_EOL;
$product = Product::where('supplier_id', '=', $supplier->id)->where('supplierProductNumber', '=', pathinfo($v)['filename'])->get();
if (count($product) < 1) {
$this->responseAddResult([$i => ['name' => $v, 'status' => 'error', 'pid' => null, 'desc' => 'Nincs ilyen termék']]);
continue;
}
if (count($product) > 1) {
$this->responseAddResult([$i => ['name' => $v, 'status' => 'error', 'pid' => null, 'desc' => 'Több termék rendelkezik ezzel a cikkszámmal']]);
continue;
}
$product = $product->first();
$this->responseAddResult([$i => ['name' => $v, 'status' => 'ok', 'pid' => $product->id, 'desc' => $product->name]]);
}
return $this->responseMake();
}
private function getTargetDirectory()
{
return \request()->get('formUUID').DIRECTORY_SEPARATOR;
// return csrf_token().DIRECTORY_SEPARATOR;
}
private function chunkUpload(Request $request)
{
$request->get('chunks');
$request->get('chunk');
$partStr = '.part';
$fileNameWithPath = $this->getTargetDirectory();
$fileNameWithPath .= $request->get('name').$partStr;
\Storage::disk('uploader')->append($fileNameWithPath, $request->file('file')->get());
// \Storage::disk('uploader')->append($fileNameWithPath,Carbon::now());
if ($request->get('chunk') == $request->get('chunks') - 1) {
\Storage::disk('uploader')->move($fileNameWithPath, str_replace($partStr, '', $fileNameWithPath));
}
return response()->json([
'jsonrpc' => '2.0',
'result' => null,
'id' => 'id',
], 200);
}
public function upload(Request $request)
{
$this->responseAddNewData('function', 'upload');
if ($request->get('chunks') > 1) {
return $this->chunkUpload($request);
}
$fileNameWithPath = $this->getTargetDirectory().$request->get('name');
if (\Storage::disk('uploader')->put($fileNameWithPath, $request->file('file')->get())) {
$this->responseAddResult([$request->get('fileId') => ['name' => $request->get('name'), 'status' => 'uploaded', 'uploaded' => Carbon::now()->toDateTimeString()]]);
return $this->responseMake();
}
$this->responseAddError('Feltöltési hiba!');
return $this->responseMake();
}
private function x()
{
// 5 minutes execution time
@set_time_limit(5 * 60);
// Uncomment this one to fake upload time
usleep(500000);
// die(ini_get("upload_tmp_dir"));
// Settings
// $targetDir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload";
$targetDir = './uploads';
$cleanupTargetDir = true; // Remove old files
$maxFileAge = 12 * 3600; // Temp file age in seconds
// Create target dir
if (! file_exists($targetDir)) {
@mkdir($targetDir);
}
// Get a file name
if (isset($_REQUEST['name'])) {
$fileName = $_REQUEST['name'];
} elseif (! empty($_FILES)) {
$fileName = $_FILES['file']['name'];
} else {
$fileName = uniqid('file_');
}
$filePath = $targetDir.DIRECTORY_SEPARATOR.$fileName;
// Chunking might be enabled
$chunk = isset($_REQUEST['chunk']) ? intval($_REQUEST['chunk']) : 0;
$chunks = isset($_REQUEST['chunks']) ? intval($_REQUEST['chunks']) : 0;
// Remove old temp files
if ($cleanupTargetDir) {
if (! is_dir($targetDir) || ! $dir = opendir($targetDir)) {
exit('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}');
}
while (($file = readdir($dir)) !== false) {
$tmpfilePath = $targetDir.DIRECTORY_SEPARATOR.$file;
// If temp file is current file proceed to the next
if ($tmpfilePath == "{$filePath}.part") {
continue;
}
// Remove temp file if it is older than the max age and is not the current file
if (preg_match('/\.part$/', $file) && (filemtime($tmpfilePath) < time() - $maxFileAge)) {
@unlink($tmpfilePath);
}
}
closedir($dir);
}
// Open temp file
if (! $out = @fopen("{$filePath}.part", $chunks ? 'ab' : 'wb')) {
exit('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
}
if (! empty($_FILES)) {
if ($_FILES['file']['error'] || ! is_uploaded_file($_FILES['file']['tmp_name'])) {
exit('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}');
}
// Read binary input stream and append it to temp file
if (! $in = @fopen($_FILES['file']['tmp_name'], 'rb')) {
exit('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
}
} else {
if (! $in = @fopen('php://input', 'rb')) {
exit('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
}
}
while ($buff = fread($in, 4096)) {
fwrite($out, $buff);
}
@fclose($out);
@fclose($in);
// Check if file has been uploaded
if (! $chunks || $chunk == $chunks - 1) {
// Strip the temp .part suffix off
rename("{$filePath}.part", $filePath);
}
// Return Success JSON-RPC response
exit('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}');
}
}