【问题标题】:Laravel Error: NotFoundHttpException in RouteCollection.php line 179Laravel 错误:RouteCollection.php 第 179 行中的 NotFoundHttpException
【发布时间】:2017-09-29 13:29:16
【问题描述】:

所以我是这个 Laravel 世界的新手,我遇到了一些问题。在这里,我尝试创建一个链接来下载已存储在 Storage/app/Records 中的文件。但我不断收到此异常: ExceptionImage

这是我的刀片文件:这是重定向到控制器的链接应该在的部分,但如果我尝试将变量传递给控制器​​的方式是正确的,我不会这样做

  <a href="{{ asset('admin/contracts/download/'.$contract->records) }}" class="btn btn-large pull-right"><i class="icon-download-alt"> </i> {{$contract->records}} </a>

这是我的路线文件(我只复制了我认为值得一提的部分):

Route::group(['middleware' => ['auth'], 'prefix' => 'admin', 'as' => 'admin.'], function () {
    Route::get('/home', 'HomeController@index');

Route::resource('contracts', 'Admin\ContractsController');

Route::get('contracts/download/{filename}', ['uses' => 'Admin\ContractsController@downloadfile', 'as' => 'contracts.downloadfile']);

});

还有我的 ContractsController(我复制了“store”方法,因为我想显示我将文件存储在哪里(Storage/app/Records/)以及如何存储):

   

<?php  namespace App\Http\Controllers\Admin;
use App\Contract;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\StoreContractsRequest;
use App\Http\Requests\Admin\UpdateContractsRequest;
use Yajra\Datatables\Datatables;
use DB;
use Carbon\Carbon;
use JavaScript;
use Illuminate\Contracts\Logging\Log;
use Illuminate\Contracts\Filesystem;
use Illuminate\Support\Facades\Storage;
use Maatwebsite\Excel\Facades\Excel;
class ContractsController extends Controller
{
    /**
     * Display a listing of Contract.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        if (! Gate::allows('contract_access')) {
            return abort(401);
        }
        $user = \Auth::user();
        if (request()->ajax()) {
            $query = Contract::query();
            if (\Auth::getUser()->id==1 || \Auth::getUser()->id==2) {
              $query->with("owner");
            }
            else {
              $query->with("owner")->where('owner_id',$user->id)->get();
            }
            $template = 'actionsTemplate';
            if(request('show_deleted') == 1) {

        if (! Gate::allows('contract_delete')) {
            return abort(401);
        }
                $query->onlyTrashed();
                $template = 'restoreTemplate';
            }
            $table = Datatables::of($query);

            $table->setRowAttr([
            'data-entry-id' => '{{$id}}',
            ]);
            $table->addColumn('massDelete', '&nbsp;');
            $table->addColumn('actions', '&nbsp;');
            $table->editColumn('actions', function ($row) use ($template) {
                $gateKey  = 'contract_';
                $routeKey = 'admin.contracts';

                return view($template, compact('row', 'gateKey', 'routeKey'));
        });
            $table->editColumn('contractsname', function ($row) {
                return $row->contractsname ? $row->contractsname : '';
            });
            $table->editColumn('end_date', function ($row) {
                return $row->end_date ? $row->end_date : '';
            });
            $table->editColumn('owner.name', function ($row) {
                return $row->owner ? $row->owner->name : '';
            });

            return $table->make(true);
        }

        return view('admin.contracts.index');
    }

/**
 * Show the form for creating new Contract.
 *
 * @return \Illuminate\Http\Response
 */
public function create()
{
    if (! Gate::allows('contract_create')) {
        return abort(401);
    }
    $owners = \App\User::select(
        DB::raw("CONCAT(name,' ',lastname) AS name"),'id')
        ->pluck('name', 'id')->prepend(trans('quickadmin.qa_please_select'), '');

    return view('admin.contracts.create', compact('owners'));
}

/**
 * Store a newly created Contract in storage.
 *
 * @param  \App\Http\Requests\StoreContractsRequest  $request
 * @return \Illuminate\Http\Response
 */
public function store(StoreContractsRequest $request)
{
    if (! Gate::allows('contract_create')) {
        return abort(401);
    }
    if(!Storage::disk('local')->exists('Records')) Storage::makeDirectory('Records');
  //  var_dump($request->file('records')->getClientOriginalName());
    $path=$request->file('records')->storeAs('Records',$request->contractsname.'_'.$request->l_name.''.Carbon::now()->format('Y-m-d-H-i-s').''.$request->file('records')->getClientOriginalName());
    $storagePath  = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix();

    $contract = new Contract();
    $contract->contractsname= $request->contractsname;
    $contract->salutation= $request->salutation;
    $contract->f_name= $request->f_name;
    $contract->l_name=$request->l_name;
    $contract->addresse=$request->addresse;
    $contract->zihlerpunktnummer=$request->zihlerpunktnummer;
    $contract->telephone=$request->telephone;
    $contract->mobile=$request->mobile;
    $contract->fax=$request->fax;
    $contract->consumption_HT=$request->consumption_HT;
    $contract->consumption_NT=$request->consumption_NT;
    $contract->powersupplier=$request->powersupplier;
    $contract->tension_MS=$request->tension_MS;
    $contract->tension_HS=$request->tension_HS;
    $contract->end_date=$request->end_date;
    $contract->owner_id=$request->owner_id;
    $contract->records=$path;
    $contract->save();



    return redirect()->route('admin.contracts.index');
}


/**
 * Show the form for editing Contract.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function edit($id)
{
    if (! Gate::allows('contract_edit')) {
        return abort(401);
    }

    $owners = \App\User::get()->pluck('name', 'id')->prepend(trans('quickadmin.qa_please_select'), '');

    $contract = Contract::findOrFail($id);

    return view('admin.contracts.edit', compact('contract', 'owners'));
}

/**
 * Update Contract in storage.
 *
 * @param  \App\Http\Requests\UpdateContractsRequest  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(UpdateContractsRequest $request, $id)
{
    if (! Gate::allows('contract_edit')) {
        return abort(401);
    }
    $contract = Contract::findOrFail($id);
    $contract->update($request->all());



    return redirect()->route('admin.contracts.index');
}


/**
 * Display Contract.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function show($id)
{
    if (! Gate::allows('contract_view')) {
        return abort(401);
    }
    $contract = Contract::findOrFail($id);
    //show the csv File content
    $storagePath  = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix();

    $file = fopen($storagePath.''.$contract->records, "r");
    $file_contents = array();
    if (($file = fopen($storagePath.''.$contract->records, "r")) !== FALSE) {
      while (!feof($file)){
        $line = fgetcsv($file,1000,';');
        //$line = array_map("utf8_encode", $line);
        array_push($file_contents, $line);


      }
    }
    // echo "<pre>";
    //$contract->records=Storage::url($contract->records);
    //dd($contract->records);
    // var_dump($file_contents);
    // echo "</pre>";
  fclose($file);



    return view('admin.contracts.show', compact(['contract','file_contents']));
}


/**
 * Remove Contract from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function destroy($id)
{
    if (! Gate::allows('contract_delete')) {
        return abort(401);
    }
    $contract = Contract::findOrFail($id);
    $contract->delete();

    return redirect()->route('admin.contracts.index');
}

/**
 * Delete all selected Contract at once.
 *
 * @param Request $request
 */
public function massDestroy(Request $request)
{
    if (! Gate::allows('contract_delete')) {
        return abort(401);
    }
    if ($request->input('ids')) {
        $entries = Contract::whereIn('id', $request->input('ids'))->get();

        foreach ($entries as $entry) {
            $entry->delete();
        }
    }
}


/**
 * Restore Contract from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function restore($id)
{
    if (! Gate::allows('contract_delete')) {
        return abort(401);
    }
    $contract = Contract::onlyTrashed()->findOrFail($id);
    $contract->restore();

    return redirect()->route('admin.contracts.index');
}

/**
 * Permanently delete Contract from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function perma_del($id)
{
    if (! Gate::allows('contract_delete')) {
        return abort(401);
    }
    $contract = Contract::onlyTrashed()->findOrFail($id);
    $contract->forceDelete();

    return redirect()->route('admin.contracts.index');
}
private function _import_csv($path, $filename)
{

    $csv = $path . $filename;
    $query = sprintf("LOAD DATA local INFILE '%s' INTO TABLE users FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n' IGNORE 0 LINES (`firstname`, `lastname`, `username`, `gender`, `email`, `country`, `ethnicity`, `education`  )", addslashes($csv));
return DB::connection()->getpdo()->exec($query);

}
public function downloadfile($filename)
{
    return response()->download(storage_path('app/' . $filename));
}

}

谢谢各位!

【问题讨论】:

    标签: php laravel exception routes filesystems


    【解决方案1】:

    根据您的问题,您通过路由 url 下载文件。如果您想访问路由,则必须使用 url()

    <a href="{{ url('admin/contracts/download/'.$contract->records) }}" class="btn btn-large pull-right"><i class="icon-download-alt"> </i> {{$contract->records}} </a>
    

    如果您使用资产,那么它直接指向public文件夹。它不会路由。 还要确保您在使用时已登录用户

    'middleware' => ['auth']
    

    更新

    Route::get('contracts/download/{filename}','Admin\ContractsController@downloadfile');
    

    【讨论】:

    • 我改成你说的了,但是Route Exception还是一样的:/
    • 如果主页发布了主页 url,您是否可以访问主页
    • 还要确保您已经登录,因为您使用的是 auth 中间件
    • 是的,我可以访问所有内容。但是你的意思是:“如果它然后发布主页 url”,我很抱歉,但我没听懂
    • 你能发布完整的 ContractsController
    猜你喜欢
    • 2018-07-29
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2018-04-02
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多