php错误fopen()“文件名不能为空”

Posted

技术标签:

【中文标题】php错误fopen()“文件名不能为空”【英文标题】:php error fopen() "Filename cannot be empty at" 【发布时间】:2021-09-08 00:27:18 【问题描述】:

我正在做一个 curl -d @data.csv myserver.com 将数据发布到我的 linux 服务器。使用 laravel 我的路由会将 POST 请求路由到我的 Controller.php 中的一个函数:

    public function endpoint(Request $request)
    
        $handle = $request->file('data.csv');
        $use = fopen($request->file('data.csv'), "r");
    

现在错误日志返回:[2021-06-24 15:44:55] production.ERROR: fopen(): Filename cannot be empty "exception":"[object] (ErrorException(code: 0): fopen() --> 所以预期的 data.csv 没有到达,请求似乎是空的。当然,我先用谷歌搜索了这个问题。网上的所有答案都说这是由于临时存储上传文件的文件夹的权限错误,但那在哪里?做一个 $temp_file = tempnam(sys_get_temp_dir(), 'Tux'); echo $temp_file; echos /tmp/TuxWk8llX 这让我相信默认的 tmp 目录是 /tmp/。我的 php.ini 还说 /tmp/ 是这个上传目录(见下文)。但是做一个lson /tmp/ 表明它拥有所有权限:drwxrwxrwt. 1 root root 57 Jun 24 13:28 tmp 那么为什么请求没有通过,有什么想法吗?在此先感谢,我对此感到非常困惑! :) PS:php.ini中的; sys_temp_dir = "/tmp"可能会导致问题吗?

**php.ini config file**
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

; Whether to allow HTTP file uploads.
; http://php.net/file-uploads
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
upload_tmp_dir = /tmp

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 200M

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20

; Directory where the temporary files should be placed.
; Defaults to the system default (see sys_get_temp_dir)
; sys_temp_dir = "/tmp"

【问题讨论】:

laravel.com/docs/8.x/requests#file-paths-extensions 好的,您能解释一下如何使用它吗? public function endpoint(Request $request) $path = $request->path(); \Log::info($path); 给了我这个日志:[2021-06-24 16:21:07] production.INFO: /。如果这是真的,那么存储数据的默认目录是 / 我会怀疑应用程序是否有足够的权限来存储数据,对吧? ***.com/a/31669672/2310830 好的,所以public function endpoint(Request $request) $info = $request->getContent(); \Log::info($info); 给出以下日志:[2021-06-24 16:29:29] production.INFO: 所以那里似乎什么都没有。 【参考方案1】:

我找到了解决方案: 将use Illuminate\Http\Request; 添加到路线中对我来说是诀窍。感谢您的帮助。

【讨论】:

【参考方案2】:

也许阅读文档@https://laravel.com/docs/8.x/requests#retrieving-uploaded-files

如果 POST 字段名为 data.csv$request->file('data.csv') 将包含一个临时文件的对象。

【讨论】:

嗨,好的,所以问题更多的是如何正确命名帖子字段?我正在使用 curl -F 'name=data.csv' myserver.com 发布数据。对吗? 建议您转储请求对象的内容以查看实际内容 好的,感谢您阅读 documentioan 的建议。我找到了解决方案:将use Illuminate\Http\Request; 添加到路由中对我来说是诀窍。谢谢您的帮助。乐!

以上是关于php错误fopen()“文件名不能为空”的主要内容,如果未能解决你的问题,请参考以下文章

php fopen函数返回false

PHP中的fopen()函数的返回值是啥?

php中fopen函数的返回值是啥啊?

php中的错误处理机制

function.fopen:无法打开流:PHP 中的权限被拒绝

无法使用模式 r 打开:fopen():AWS Elastic Beanstalk