三种「包括 Oss」文件上传代码示例

前言

提供三种常见的文件上传代码示例,包括上传到服务器,上传到服务器后转到oss、直接上传到阿里云oss;

文件上传到服务器

public function upload(Request $request)
{
    // 判断有没有文件
    if ($request->hasFile('file')) {
        $file = $request->file('file');
        $data = array();
        // custom_path是用户指定的文件夹,方便文件分类,如果不传默认归到snap文件夹中;
        // 示例路径:upload/snap/2023/36/
        $filepath='upload/' . ($request->custom_path??"snap") . '/' .date("Y"). '/'. $request->user()->company_id . '/';
        $destinationPath = public_path(path);

        // 如果目标目录不存在,则创建之
        if (!file_exists($destinationPath)) {
            mkdir($destinationPath, 0777, true);
        }

        // 文件名,这里是防止重复
        // 示例: 1675929724 测试文件.pdf
        $filename =  time() . ' '.$file->getClientOriginalName();

        // 存储文件类型
        $data['contenttype'] = strtolower($file->getClientOriginalExtension()) ?: 'png';

        // 获取字节大小
        $data['filesize'] = $file->getSize();

        // 保存文件到目标目录
        try {
            $file->move($destinationPath, $filename);
        } catch (Exception $e) {
            return $this->failed($e->getMessage() ?? '文件上传失败');
        }
        $data['filepath'] = $filepath.$filename;

        return $this->success($data);
    }

    return $this->failed('未接受到需要上传的文件');
}

通过服务器上传到oss

public function upload(Request $request)
{
     // 判断有没有文件
    if ($request->hasFile('file')) {
        // 获取文件
        $file = $request->file('file');
        // 填写 accessKeyId 也可以放到env中
        $accessKeyId = "LTAI5t*********dFnt";
        // 填写 accessKeySecret 也可以放到env中
        $accessKeySecret = "m6Meu2j**********tw8kE";
        // 填写 endpoint
        $endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 填写Bucket名称,例如examplebucket。
        $bucket = "examplebucket";

        $object =  'upload/' .($request->custom_path??"snap").'/'.date('Y').'/'. $request->user()->company_id  . '/' . time().' '.$file->getClientOriginalName();
        try{
            $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

            $ossClient->uploadFile($bucket, $object, $file);
            //存储文件类型
            $data['contenttype'] = strtolower($file->getClientOriginalExtension()) ?: 'png';

            //获取字节大小
            $data['filesize'] = $file->getSize();

            //获取文件路径
            $data['filepath'] = $object;

            return $this->success($data);

        } catch(OssException $e) {

            return $this->failed($e->getMessage());

        }
    }
    return $this->failed('未接受到需要上传的文件');
}

通过签名方式上传到oss

https://jouzeyu.com/posts/158bdfdf-aef3-a468-2f0d-889bf49753ee/

e053d93d-5578-c3b5-60b1-8454b7b63b13

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。