Laravel 4 - 文件上传

22

我有一个表单,其中用户将上传一张图片。我想将图像的路径存储在数据库中,并将图像保存到服务器上的public/img/文件夹中。

表单是使用以下代码打开的:{{ Form::open(['route'=>'pizzas.store', 'files'=>true]) }},以便能够POST文件。检查HTML,我有以下内容:

<form method="POST" action="http://mypizza/pizzas" 
  accept-charset="UTF-8" enctype="multipart/form-data">

我可以向我的控制器发送POST请求,并按预期从表单接收所有数据。处理文件的方法如下:

public function store() {
    //TODO -  Validation

    $destinationPath = '';
    $filename        = '';

    if (Input::hasFile('image')) {
        $file            = Input::file('image');
        $destinationPath = '/img/';
        $filename        = str_random(6) . '_' . $file->getClientOriginalName();
        $uploadSuccess   = $file->move($destinationPath, $filename);
    }


    $pizza = Pizza::create(['name'       => Input::get('name'),
                           'price'       => Input::get('price'),
                           'ingredients' => Input::get('ingredients'),
                           'active'      => Input::get('active'),
                           'path'        => $destinationPath . $filename]);

    if ($pizza) {
        return Redirect::route('pizzas.show', $pizza->id);
    }

    //TODO - else
}

当我选择一个文件并提交表单时,似乎一切都正常工作,除了没有在/img文件夹中保存任何文件。数据库正确注册了文件路径和名称。

if {...}块之后立即运行dd($uploadSuccess);,我得到以下结果:

object(Symfony\Component\HttpFoundation\File\File)#220 (2) {
  ["pathName":"SplFileInfo":private]=> string(17) "/img\YZmLw7_2.jpg"
  ["fileName":"SplFileInfo":private]=> string(12) "YZmLw7_2.jpg" }

我做错了什么?


3
除了[Reflic]的答案之外,还需要按如下方式调整数据库中的 path'path' => 'img/' . $filename]); - George Rivera
没错,我忘记了这个。 - Reflic
5个回答

33
您的$destination_path 是错误的。您必须在变量$destination中包含 /public 目录的路径,如下所示:

$destinationPath = public_path().'/img/';


3

由于您似乎正在使用php 5.4,您可能还可以考虑使用Stapler。它现在非常稳定(很快就会退出beta版本),可以为您节省很多您现在必须编写的样板代码。


1
$destinationPath= public_path() . 'img/';

@Reflic 给出的答案可能是正确的... 但对我不适用.... 这个路径对我起作用了。这可能是因为我从网址中删除了 "public/" ... 谢谢。

1
我遇到了同样的问题。我的代码几乎都正确,除了

这一部分。
public_path()

没有将内容添加到我的文件夹中

$destinationPath= public_path() . '/img/'; // Worked perfect

我也这样做来更改我的文件名

我获取了文件扩展名

$extension = Input::file('YourFileName')->getClientOriginalExtension();
$filename = WhateverYouWantHere . '.' . $extension;

就是这样,文件名已更改。Laravel确实很棒


1
你也可以写相对路径。 例如

$destinationPath="resources/assets/images/";

或者

$destinationPath= 'public/img/';


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接