文件上传哪里做错了,请各位指导一下

ziyoren

问题描述

上传文件后,保存的文件不正确。

上传的是图片文件,得到的下面截图的内容

截图

程序代码或配置

<?php

namespace app\api\controller;

use support\Request;
use Tinywan\ExceptionHandler\Exception\ServerErrorHttpException;
use Tinywan\Jwt\JwtToken;
use Tinywan\Storage\Storage;  //这里用到https://www.workerman.net/plugin/21 @Tinywan

class UploadController
{

//照着官方文档的示例写的 https://www.workerman.net/doc/webman/request.html#%E8%8E%B7%E5%8F%96%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6
    public function file(Request $request)
    {
        $uid = JwtToken::getCurrentId();
        $files = $request->file();
        $result = [];
        foreach ($files as $file) {
            if ($file && $file->isValid()) {
                var_export($file->getUploadExtension());  //输出''
                echo PHP_EOL;
                var_export($file->getUploadMimeType());  //输出 'application/json'
                echo PHP_EOL;
                var_export($file->getUploadErrorCode());  //输出 0
                echo PHP_EOL;
                var_export($file->getUploadName());  //输出 'file-1685872373882'
                echo PHP_EOL;
                var_export($file->getSize());  //输出 34
                echo PHP_EOL;
                var_export($file->getPath());  //输出 '/tmp'
                echo PHP_EOL;
                var_export($file->getRealPath()); //输出 '/tmp/workerman.upload.EEdPEm'
                echo PHP_EOL;

                $filePath = '/uploads/' . $uid . '/' . $file->getUploadName();
                $file->move(public_path() . $filePath);
                array_push($result, ['url' => $this->getFullUrl($filePath)]);
            } else {
                throw new ServerErrorHttpException('未找到上传的文件');
            }
        }
        return response_json($result);
    }

    // 用的Tinywan的上传组件
    public function img(Request $request)
    {
        Storage::config();
        $res = Storage::uploadFile();
        return response_json($res);
    }

    public function getFullUrl($file = '')
    {
        $request = request();
        return $request->url() . $file;
    }
}

config/plugin/tinywan/storage/app.php 本地上传的配置如下

<?php

return [
    'enable' => true,
    'storage' => [
        'default' => 'local', // local:本地 oss:阿里云 cos:腾讯云 qos:七牛云
        'single_limit' => 1024 * 1024 * 200, // 单个文件的大小限制,默认200M 1024 * 1024 * 200
        'total_limit' => 1024 * 1024 * 200, // 所有文件的大小限制,默认200M 1024 * 1024 * 200
        'nums' => 10, // 文件数量限制,默认10
        'include' => [], // 被允许的文件类型列表
        'exclude' => [], // 不被允许的文件类型列表
        // 本地对象存储
        'local' => [
            'adapter' => \Tinywan\Storage\Adapter\LocalAdapter::class,
            'root' => public_path().'/uploads/',
            'dirname' => function () {
                return date('Ymd');
            },
            'domain' => 'http://192.168.1.78:8788/',
            'uri' => 'uploads/', // 如果 domain + uri 不在 public 目录下,请做好软链接,否则生成的url无法访问
            'algo' => 'sha1',
        ],
        //......省略其他配置.....
    ]
]

重现问题的步骤

前后端分离,前端用的uviewui的上传文件请求。

截图

操作系统环境及workerman/webman等具体版本

Webman-framework v1.5.5

Alpine Linux 3.16.0

Workerman version:4.1.9

PHP version:8.1.7

Event-Loop:\Workerman\Events\Select

523 3 0
3个回答

ziyoren

写了一个普通的表单上传,正常

    <form action="/api/upload/file" method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <input type="submit" value="Upload" />
    </form>

这样上传成功了

AJAX方式上传好像Content-Type判断有问题

  • 暂无评论
ziyoren

截图

这是本地上传时就提交了错误的数据?

  • ziyoren 2023-06-04

    是前端少传了参数,导致的上述问题。

ziyoren

已解决,前端代码少指定了上传文件,导致的

  • 暂无评论
🔝