【问题标题】:Laravel file upload creates folder with a temp fileLaravel 文件上传使用临时文件创建文件夹
【发布时间】:2018-01-18 01:11:12
【问题描述】:

我正在尝试让我的应用程序将文件上传到“public/uploads/documentos/{the-id}”,但无法弄清楚我当前的设置有什么问题。现在,如果我上传一个名为“myfile.pdf”的文件,它会创建一个名为“myfile.pdf”的文件夹,并在其中创建一个 *.tmp 文件。在我的数据库中,“{the-id}/myfile.pdf”被保存为文件 url,但这会将我带到文件夹视图,而我想要查看其中的文件。

如何更改它,以便在上传文档时直接在“public/uploads/documentos/{the-id}”下创建文件“myfile.pdf”,以便我可以这样访问它? {the-id} 是根据患者的 id 创建的文件夹,因此属于他们的所有文档都保存在同一个文件夹中。


控制器

    public function store(Request $request)
    {
        $this->validate($request, [
            'tipo' => 'required|max:100',
            'descripcion' => 'max:200',
            'fecha_documento' => 'max:20',
            'archivo' => 'required|mimes:doc,docx,pdf,jpg,png,jpeg',
            'mascota_id' => 'required',
            'mascota_num' => 'required',
        ]);
                
        $documento = new Documento;
        $documento->mascota_num = $request->input('mascota_num');
        $documento->mascota_id = $request->input('mascota_id');
        $documento->tipo = ucfirst($request->input('tipo'));
        $documento->descripcion = ucfirst($request->input('descripcion'));
        $documento->fecha_documento = $request->input('fecha_documento');
        
        if($request->hasFile('archivo')) {
            $archivo = $request->file('archivo');
            $archivo_folder = public_path('/uploads/documentos/') . $request->input('mascota_num');         
            $archivo_nombre = $archivo->getClientOriginalName();
            $archivo_url = $archivo_folder . '/' . $archivo_nombre;
            
            if (file_exists($archivo_folder)) {
                $archivo->move($archivo_folder . '/' . $archivo_nombre);
            } else {
                File::makeDirectory($archivo_folder, $mode = 0777, true, true);
                $archivo->move($archivo_folder . '/' . $archivo_nombre);
            }
            
            $documento->archivo = $request->input('mascota_num') . '/' . $archivo_nombre;
            $documento->save();
        
            return redirect()->route('mascotas.show', [$request->input('mascota_num')])->with('message', 'Documento agregado exitosamente.');
        }
    }

我上传的文件在这段代码中的外观:

uploads/documentos/

-- 1
  -- file.pdf /folder
    -- random_name.tmp /file
-- 2
  -- file.pdf /folder
    -- random_name.tmp /file
  -- otherfile.pdf /folder 
    -- random_name.tmp /file

}

我想要什么

uploads/documentos/

-- 1
  -- myfile.pdf /file
-- 2
  -- myfile.pdf /file
  -- otherfile.pdf /file

理想情况下,我希望将文件保密,因此我尝试使用以下代码将它们上传到存储文件夹:

Storage::put('documentos/'.$request->input('mascota_num').'/', $archivo_nombre);
$documento->archivo = Storage::url('documentos/'.$request->input('mascota_num').'/'.$archivo_nombre);

但是没有创建 {the-id} 文件夹并且没有保存文件,我得到的只是:

storage/app/documentos/

-- 1 /file without extension
-- 2 /file without extension

我愿意暂时让第一部分工作。提前感谢您的帮助。

【问题讨论】:

    标签: laravel-5 laravel-filesystem


    【解决方案1】:

    经过多次尝试和错误,我设法将文件上传到我的应用程序的存储文件夹。

    if($request->hasFile('archivo')) {
        $archivo = $request->file('archivo');
    
        Storage::disk('documentos')->put($request->input('mascota_num') . '/' . $archivo->getClientOriginalName(),  File::get($archivo));
                                
        $documento->archivo = $request->input('mascota_num') . '/' . $archivo_nombre;
        $documento->save();
    }
    

    文件保存在正确的患者 ID 文件夹下的 /storage/app/public/documentos/ 并使用正确的文件名。

    我还没有找到正确链接到我的 show Blade 文件的方法,Storage::url('documentos/'.$documento->archivo)) 显示 404 错误页面,即使文件路径正确。希望接下来我可以完成这项工作。

    【讨论】:

    • 我忘记创建从 public/storage 到 storage/app/public 的符号链接。现在我可以使用以下命令从刀片链接到我上传的文件:Storage::url('documentos/'.$documento->archivo))
    猜你喜欢
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2014-01-06
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多