## laravel react Img upload
## react component
```
import { useState } from "react";
import { useForm } from "react-hook-form";
import { useDispatch } from "react-redux";
import { createNewPage } from "../../store/edition/edition.action";
export default function PageCreationForm({ setShow }) {
const { register, handleSubmit } = useForm({
shouldUseNativeValidation: true,
});
const dispatch = useDispatch();
const [loading, setLoading] = useState(false);
const onSubmit = async (data, e) => {
console.log(data);
const params = {
inputFile: data.inputFile,
name: data.inputFile[0].name.split(".")[0],
smallPreview : true ,
largePreview : true ,
};
console.log({params});
setLoading(true);
// @ts-ignore
dispatch(createNewPage(params)).then((res) => {
setLoading(false);
e.target.reset();
setShow(false);
});
};
return (
<div>
<form action="" onSubmit={handleSubmit(onSubmit)}>
<label htmlFor="">Select image</label>
<br />
<input
style={{ marginTop: "10px", marginBottom: "20px" }}
type="file"
multiple
{...register("inputFile", { required: "select a file " }) }
/>
<br />
<button
disabled={loading}
style={{
width: "107px",
height: "30px",
background: "lightblue",
borderRadius: "5px",
border: "0",
}}
type="submit"
>
{loading ? "creating..." : "create"}
</button>
</form>
</div>
);
}
```
## action file
```
export const createNewPage = (rawData) => async (dispatch, getState) => {
console.log({ rawData });
// console.log(data.inputFile[0])
// console.log(data.inputFile[1])
// console.log(data.inputFile.length)
for (let i = 0; i < rawData.inputFile.length; i++) {
const id = toast.loading(`Uploading file ${rawData.inputFile[i].name}...`);
//do something else
// upload page
const data = {
inputFile: [rawData.inputFile[i]],
name: rawData.inputFile[i].name,
smallPreview: rawData.smallPreview,
largePreview: rawData.largePreview,
};
const uploadFileRequest = await FileUploadApi.upload(data);
console.log({ uploadFileRequest });
if (!uploadFileRequest.success) {
// alert(`failed to upload file`);
toast.update(id, {
render: "Upload Failed",
type: "error",
isLoading: false,
autoClose: 1000,
});
return
}
toast.update(id, {
render: "File Uploaded",
type: "success",
isLoading: false,
autoClose: 1000,
});
// store in edition
const newPageParams = {
id: getId(),
name: data.name,
imgFileName: uploadFileRequest.data.name,
previewImgFileName: uploadFileRequest.data.name,
smallPreview: uploadFileRequest.data.smallPreview,
largePreview: uploadFileRequest.data.largePreview,
areaMaps: [],
};
console.log(newPageParams);
const currentEdition = getState().editionReducer.currentEdition;
currentEdition.previewPages = [
...currentEdition.previewPages,
newPageParams,
];
// update edition in db
const editionUpdateParams = {
...currentEdition,
};
console.log({ editionUpdateParams });
const editionUpdateRequest = await EditionApi.updateEdition(
editionUpdateParams
);
console.log({ editionUpdateRequest });
if (!editionUpdateRequest.success) {
alert(` edition update failed `);
}
// toast("Wow so easy!")
dispatch({
type: editionActionType.SET_CURRENT_EDITION,
payload: editionUpdateParams,
});
}
};
```
## api file
```
import axios from "axios";
import { apiBasePath } from "../lib/api.path";
import { toast } from 'react-toastify';
export const upload = async (data) => {
try {
console.log(data.inputFile);
var formData = new FormData();
formData.append("file", data.inputFile[0]);
// @ts-ignore
formData.append("smallPreview", data.smallPreview || false);
// @ts-ignore
formData.append("largePreview", data.largePreview || false);
console.log({ formData });
const response = await axios.post(
`${apiBasePath}/upload-file`,
formData,
{
headers: {
"Content-Type": "multipart/form-data",
},
}
);
console.log(response.data);
return {
success: true,
data: {
...response.data,
},
};
} catch (error) {
console.log(` --- there was an error while uploading the file ---`);
console.log(error);
return {
success: false,
data: null,
};
}
};
export default {
upload,
};
```
# Laravel Controller
```
<?php
namespace App\Http\Controllers\Epaper;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Intervention\Image\Facades\Image;
class FileUploadController extends Controller
{
public function upload(Request $request)
{
if (!$request->hasFile('file')) {
return response()->json(['upload_file_not_found'], 400);
}
// if (!$request->has('uploadFolder')) {
// return response()->json(['upload_folder_not_found'], 400);
// }
$uploadPath = 'public/' . $request->uploadFolder;
// $tempUploadPath = 'storage/app/public/' . $request->uploadFolder; // for live c panel
$tempUploadPath = 'storage/' . $request->uploadFolder;
$file = $request->file('file');
$extension = $file->getClientOriginalExtension();
$name = Str::uuid()->toString() . '.' . $extension;
$smallPreview = Str::uuid()->toString() . '.' . $extension;
$largePreview = Str::uuid()->toString() . '.' . $extension;
// $path = $file->storeAs($uploadPath, $name);
$tempPath = $tempUploadPath . '/' . $name;
// return [$tempPath,$path] ;
// $filePath = $uploadPath .'/'. $name ;
Image::make($request->file('file'))->save($tempPath, 90);
if ($request->largePreview == 'true') {
Image::make($request->file('file'))->save($tempUploadPath . '/' . $largePreview, 20);
}
if ($request->smallPreview == 'true') {
Image::make($request->file('file'))->save($tempUploadPath . '/' . $smallPreview, 5);
}
// return $img ;
return response()->json([
'name' => $name,
'smallPreview' => $request->smallPreview == 'true' ? $smallPreview : '',
'largePreview' => $request->largePreview == 'true' ? $largePreview : '',
'path' => $tempPath,
'uploadPath' => $request->uploadFolder,
'hasLargePreview' => $request->largePreview,
'hasSmallPreview' => $request->smallPreview
], 200);
}
public function getBase(Request $request)
{
// return "ok" ;
// getBase
$path = $request->get('path');
$type = pathinfo($path, PATHINFO_EXTENSION);
$data = file_get_contents($path);
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
// return $base64 ;
return response()->json(['data' => strval($base64)], 200);
}
}
```