Sandie-fee's avatar

Tmp File upload issue

Hi Everyone,

I have been trying to upload an image however everytime I upload it. It changes the location and file type to a temporary file. I don't understand why it isn't working as I have set the save and move path for the image.

I should get this "/images/game/default.jpg" but instead I get this "/images/game/C:\Users\Sandie\AppData\Local\Temp\phpA573.tmp"

Here is my code

Controller

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Game;
use App\Series;
use PhpParser\Parser\Multiple;
use App\Http\Controllers\Auth;

class GameController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $games =   Game::all();
        $series = Series::all();


        return view('games.index', compact(['games', 'series']));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        $series = Series::all();
        // dd($series);
        return view('games.create', compact('series'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {

        $request->validate([
            'name' => 'required|min:2',
            'series' => 'required',
            'online' => 'required',
            'multiplayers' => 'required',
            'complete' => 'required',
            'image' => 'image|mimes:jpg,jpeg,bmp,svg,png|max:5000',
        ]);

        $image = new game;

        if (request()->has('image')){
            $image = request()->file('image');
            $imagename = time().'.'.$image->getClientOriginalExtension();
            $imagesave = public_path('/images/game/');
            $image -> move($imagesave,$imagename);

        }

        // $game =  Game::create([
        //     'name' => $request->input('name'),
        //     'online' => $request->input('online'),
        //     'series_id' => $request->input('series'),
        //     'mutliplayer_id' => $request->input('multiplayers'),
        //     'completed' => $request->input('complete'),

        // ]);

        $game =  Game::create([
            'name' => $request->input('name'),
            'online' => $request->input('online'),
            'series_id' => $request->input('series'),
            'mutliplayer_id' => $request->input('multiplayers'),
            'completed' => $request->input('complete'),
            'image' => '/images/game/'.$image,
        ]);

        // $game['image'] = '/images/game/'.$image;
        // Game::create([$game]);

        return redirect()->route('games.all');
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */


    public function update(Request $request, $id)
    {
        $game = Game::find($id);

        //adds validation to form
        $request->validate([
            'name' => 'required|min:2',
            'series' => 'required',
            'online' => 'required',
            'multiplayers' => 'required',
            'complete' => 'required',
        ]);

        //updates game information
        $game->update([
            'name' => $request->input('name'),
            'online' => $request->input('online'),
            'series_id' => $request->input('series'),
            'mutliplayer_id' => $request->input('multiplayers'),
            'completed' => $request->input('complete'),
            'image' => $request->input('image'),
         ]);

        $game->save();
        return redirect()->route('games.all');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $game = Game::find($id);
        $game->delete();
        return redirect()->back();
    }


    //searches database for games which name matches search
    public function getSearch()
    {
        $results = Game::all();
        return view('search.form', compact('results'));
    }

    public function searchResults(Request $request)
    {
        $searchTerm = $request->input('search');
        $series = Series::all();
        $results = Game::where('name', 'like', '%' . $searchTerm . '%')->get();
        return view('search.results')->with(['results' => $results, 'series' => $series]);
    }

    // filter for games that are completed
    public function getCompleted(Request $request)
    {
        $series = Series::all();
        $results = Game::where('completed', 1)->get();
        return view('games.index')->with(['games' => $results, 'series' => $series]);
    }

    //filter for games with multiplayer
    public function getMultiplayer(Request $request)
    {
        $series = Series::all();
        $results = Game::where('mutliplayer_id', 1)->get();
        return view('games.index')->with(['games' => $results, 'series' => $series]);
    }

    //filter for games with online
    public function getOnline(Request $request)
    {
        $series = Series::all();
        $results = Game::where('online', 1)->get();
        return view('games.index')->with(['games' => $results, 'series' => $series]);
    }
}

Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\Series;


//relationships
class Game extends Model
{
    protected $fillable =['name','completed','online','series_id','mutliplayer_id','image'];


 public function series(){
     return $this->belongsTo(Series::class);
 }


}

Views

{{-- Create viewe for games --}}
@extends('layouts.app')


@section ('content')

<div class="col-md-6 offset-md-3">
        <h1 class="text-center "> Add New Game </h1>
<form action="{{route('games.create')}}" method="post" enctype="multipart/form-data">

    @csrf

    {{-- calls template for update/add --}}

    {{-- Game create/update form --}}

<div class="form-group">
    <label for="name">Name </label>
<input type="text" class="form-control  @error('name') is-invalid @enderror" name="name" id="name" value ="{{old('name')? old('name') :"" }}">
@error('name')
<span class="invalid-feedback text-danger" role="alert">
    <strong>{{ $message }}  </strong>
</span>
@enderror

</div>
<div class="form-group">
        <label for="series">Series </label>
  <select name="series"  class="form-control   @error('series') is-invalid @enderror" id="series">
        <option value= "" > please select</option>
        @foreach ($series as $seri)
  <option value="{{$seri->id}}"  {{old('series') == $seri->id ? "selected"  : ""}}  > {{$seri->name}}</option>
        @endforeach
  </select>
  @error('series')
  <span class="invalid-feedback text-danger" role="alert">
      <strong>{{ $message }}  </strong>
  </span>
  @enderror
 </div>

    <div class="form-group">
            <label for="online">Online </label>
      <select name="online"  class="form-control @error('online') is-invalid @enderror" id="online" >
            <option value=""> please select</option>
            <option value="1"> Yes </option>
            <option value="0"> No</option>
      </select>
      @error('online')
      <span class="invalid-feedback text-danger" role="alert">
          <strong>{{ $message }}  </strong>
      </span>
      @enderror
        </div>
        <div class="form-group">
                <label for="multiplayers"> Multiplayers</label>
          <select name="multiplayers"  class="form-control @error('multiplayers') is-invalid @enderror" id="multiplayers">
                <option value=""> please select</option>
                <option value="1"> Yes </option>
                <option value="0"> No</option>

          </select>
          @error('multiplayers')
          <span class="invalid-feedback text-danger" role="alert">
              <strong>{{ $message }}  </strong>
          </span>
          @enderror
            </div>
            <div class="form-group">
                <label for="complete"> Completed game?</label>
          <select name="complete"  class="form-control @error('complete') is-invalid @enderror" id="complete">
                <option value=""> please select</option>
                <option value="1"> Yes </option>
                <option value="0"> No</option>

          </select>

          @error('complete')
          <span class="invalid-feedback text-danger" role="alert">
              <strong>{{ $message }}  </strong>
          </span>
          @enderror
            </div>

            <div class="form-group">
                <label for="image">Image </label>
            <input type="file" class="form-control  @error('image') is-invalid @enderror" name="image" id="image" value ="default.jpg">
            @error('image')
            <span class="invalid-feedback text-danger" role="alert">
                <strong>{{ $message }}  </strong>
            </span>
            @enderror
        </div>

<div class="form-group">

    <button type="submit"  class="btn btn-info float-right"> Add New Game</button>
    </div>

</form>
</div>
@endsection

Any help with this would be greatly appreciated.

Thanks For Looking, Sandie-fee :)

0 likes
19 replies
Sandie-fee's avatar

I've had a look at the post you recommended, but i'm not very good at laravel and don't really understand it. Please could you explain it to me?

thanks

jlrdw's avatar

Make sure

   public_path('/images/game/')

Has correct permissions.

Snapey's avatar

in create

Remove this line (it does nothing)

        $image = new game;

because you overwrite it in the next line.

Save the image filename at;

   'image' => '/images/game/'.$imagename,

in 'update', remove this line if there is no image

            'image' => $request->input('image'),
Sandie-fee's avatar

i have right clicked and checked security on every folder and it is all set to 'allow'. Any ideas what this could be?

Thanks

Sandie-fee's avatar

Hi Snapey,

I have just tried your fixes and now create works but the update doesn't. The code looks to be basically the same as the create but with update instead. It goes through but never updates the table after clicking submit.

I have changed the code to look similar so here is the new update code.

 public function update(Request $request, $id)
    {
        //adds validation to form
        $request->validate([
            'name' => 'required|min:2',
            'series' => 'required',
            'online' => 'required',
            'multiplayers' => 'required',
            'complete' => 'required',
            'image' => 'image|mimes:jpg,jpeg,bmp,svg,png|max:5000',
        ]);

         $game = Game::find($id);

        // is there an image?
        if (request()->has('image')){
            $image = request()->file('image');
            $imagename = time().'.'.$image->getClientOriginalExtension();
            $imagesave = public_path('/images/game/');
            $image -> move($imagesave,$imagename);
        }

        //updates game information
        $game->update([
            'name' => $request->input('name'),
            'online' => $request->input('online'),
            'series_id' => $request->input('series'),
            'mutliplayer_id' => $request->input('multiplayers'),
            'completed' => $request->input('complete'),
            'image' => '/images/game/'.$imagename,
         ]);

        $game->save();
        return redirect()->route('games.all');
    }

Any ideas? Thanks Sandie-fee

jlrdw's avatar

Any errors, is id being passed, use your browser developer tools to help troubleshoot.

jlrdw's avatar

Try

           $game->name = $request->input('name');
           // ditto other fields
           .
           .
           .
        $game->save();
Sandie-fee's avatar

I'm getting a valudation error on the image - it's saying the image i picked isn't an image and so wont run the update.

Sandie-fee's avatar

I'm sorry I don't quite understand what you are wanting me to do...

Sandie-fee's avatar

I can't see if any of this has fixed it due to the validation issue on the image. When I click update it says that the image is not an image (even though i picked the same image that worked in the create - so surely it should work?) and wont run the update.

thanks

Sandie-fee's avatar

If i comment out the valdation on the image i get this error:

Symfony\Component\Debug\Exception\FatalThrowableError
Call to a member function getClientOriginalExtension() on null
jlrdw's avatar

Double check your form. Use your browser developer tools to help troubleshoot.

Sandie-fee's avatar

The form is the same for both create and update - the validation is also the same for both. So i don't know why the image works in create but the validation says it's not an image in update.

Sandie-fee's avatar

I have a new error:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'image' cannot be null (SQL: update `games` set `series_id` = 3, `name` = test, `online` = 0, `image` = ?, `games`.`updated_at` = 2020-05-02 22:10:41 where `id` = 14)
Sandie-fee's avatar

I GOT IT WORKING!! I'M SO HAPPY!!

Thank you for all your help <3 :D

Snapey's avatar

Think how you can make the code the same actual code, not a copy of it. For instance if you had a function, and you passed it the request, and the model, and the functions job was to save the file and update the model.

Snapey's avatar

This

$game->update([
        'name' => $request->input('name'),
        'online' => $request->input('online'),
        'series_id' => $request->input('series'),
        'mutliplayer_id' => $request->input('multiplayers'),
        'completed' => $request->input('complete'),
        'image' => '/images/game/'.$imagename,
     ]);

    $game->save();

will fail if you don't pass an image, because $imagename will not be set.

and $game->save() is unnecessary because you already used update.

Please or to participate in this conversation.