上传文件至阿里云OSS,整体逻辑是,文件先临时上传到本地,然后在上传到OSS,最后删除本地的临时文件(也可以不删,具体看自己的业务需求),具体实现流程如下:
 
1、下载阿里云OSS对象上传SDK(PHP版) 通过Github下载

2、解压后,可自行修改目录名称,以下为本人项目实例(aliyun_oss改过之后的名称)

项目目录结构如下:

3、Index.php 为文件上传静态表单页

4、do_upload.php 为文件处理控制页,封装的代码如下:上传文件相关的辅助函数可以自行封装,本文是为了便于展示,全部放在一个文件中

 <?php
/**
* @Class: do_upload.php
* @Description: 控制器
* @Date: 2019/10/16
*/
header("Content-Type:text/html;charset=utf-8");
set_time_limit(0);
// error_reporting(E_ALL);
require __DIR__.'/AliyunOss.php';
if(!empty($_FILES['oss_file']) && !empty($_POST['type'])){
$file_arr = getFiles();
$AliyunOss = new AliyunOss();
   foreach ($file_arr as $file){
$res = upload_File($file,$type_name.'/'.$user_info['contact'],$user_info);
if(isset($res['fname']) && isset($res['dest']) && isset($res['file_name'])){
$result = $AliyunOss->upload_file($res['dest'],$res['fname']);
if($result){
//1、存入数据库 此处部分变量及入库代码补全 知道逻辑即可
$insert_time = date('Y-m-d H:i:s',time());
$fileData = array(
'phone' => "'{$phone}'",
'company_name' => "'{$oss_db->escape($user_info['contact'])}'",
'insert_time' => "'{$insert_time}'",
'file_name' => "'{$res['file_name']}'",
'file_url' => "'{$result['oss_file']}'"
);
$sql = "insert into `oss_file` (".implode(',', array_keys($fileData)).") values (".implode(',', array_values($fileData)).")";
$oss_db->query($sql);
if($oss_db->insert_id()){
//2、删除临时文件
unlink($res['dest']);
}
}
}
}
echo '上传成功';
header('Location:list.php');
die;
}else{
echo '上传失败';
} /**
* 文件上传
* @description
* @param $file
* @param string $path
* @param $max_size
* @param $allowExt
* @return mixed
*/
function upload_File($file,$oss_dir = '',$user_info,$path = __DIR__.'/temp'){
$filename=$file['name'];
$temp_name=$file['tmp_name'];
$error=$file['error'];
$res = [];
if ($error==UPLOAD_ERR_OK) {
// if ($size>$max_size) {
// $res['mes']=$filename."文件超过规定上传大小";
// }
$ext = getExt($filename);
if (in_array($ext, array('exe'))) {
$res['mes']=$filename.'非法的文件';
}
if (!is_uploaded_file($temp_name)) {
$res['mes']=$filename."文件不是通过HTTP POST 方法上传上传过来的";
} if ($res) {
return $res;
} if (!file_exists($path)) {
mkdir($path,0777,true);
chmod($path, 0777);
}
$fname = getUniName($filename,$user_info);
$destination = $path.'/'.$fname.'.'.$ext;
if (move_uploaded_file($temp_name, $destination)) {
$res['mes'] = $filename.'上传成功';
$res['dest'] = $destination;
$res['fname'] = $oss_dir.'/'.$fname.'.'.$ext;
$res['file_name'] = $fname.'.'.$ext;
}else{
$res['mes']=$filename."文件上传失败";
}
}else{
switch ($error) {
case '1':
$res['mes']="超过了配置文件上传文件的大小";
break;
case '2':
$res['mes']="超过表单设置上传文件文件的大小";
break;
case '3':
$res['mes']="文件部分被上传";
break;
case '4':
$res['mes']="没有文件被上传"; break;
case '6':
$res['mes']="没有找到临时目录";
break;
case '7':
$res['mes']="文件不可写"; break;
default:
$res['mes']="上传文件失败";
break;
}
} return $res; }
/**
* 获得文件扩展名
* @param string $filename 上传文件名
* @return string 返回扩展名
*/
function getExt($filename){
$arr=explode('.', basename($filename)); return end($arr);
}
/**
* 获得文件唯一扩展名
* @return string 经过md5后生成32位唯一的上传文件名
*/
function getUniName($fileName, $user_info)
{
$new_fileName = substr($fileName,0,strrpos($fileName,'.'));
$oss_db = new data_base('10.1.51.64', 'root', 'abc@123456', 'dahua_oss');
$has_file = $oss_db->getRow("select * from `oss_file` where `phone` = '{$user_info['phone']}' and locate('{$fileName}',`file_url`)>0 ");
if ($has_file) {
$new_fileName .= '-1';
}
return $new_fileName;
} /**
* 整理多个文件
* @description
* @return mixed
*/
function getFiles(){
$files = array();
foreach($_FILES as $file){
$fileNum=count($file['name']);
for ($i=0; $i < $fileNum; $i++) {
$files[$i]['name']=$file['name'][$i];
$files[$i]['type']=$file['type'][$i];
$files[$i]['tmp_name']=$file['tmp_name'][$i];
$files[$i]['error']=$file['error'][$i];
$files[$i]['size']=$file['size'][$i];
}
}
return $files;
} ?>

5、AliyunOss.php  OSS文件上传接口类 

 <?php
/**
* @Class: AliyunOss.php
* @Description: 控制器
* @Date: 2019/10/16
*/
header("Content-Type:text/html;charset=utf-8");
// error_reporting(E_ALL); if (is_file(__DIR__ . '/aliyun_oss/autoload.php')) {
require_once __DIR__ . '/aliyun_oss/autoload.php';
} use OSS\OssClient;
use OSS\Core\OssException; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 class AliyunOss
{
private $accessKeyId;
private $accessKeySecret;
private $endpoint;
private $bucket; public function __construct() {
require_once __DIR__ . '/aliyun_oss/config.php';
$this->accessKeyId = $oss_config['accessKeyId'];
$this->accessKeySecret = $oss_config['accessKeySecret'];
// Endpoint以杭州为例,其它Region请按实际情况填写。 $endpoint="http://oss-cn-hangzhou.aliyuncs.com";
$this->endpoint = $oss_config['endpoint'];
// 存储空间名称
$this->bucket = $oss_config['bucket'];
}
  //$file_path oss文件名称 (支持中文如:商务/科技/项目计划.doc)会自动创建目录
    //$file_name 由本地文件绝对路径加文件名包括后缀组成,例如/users/local/myfile.txt
public function upload_file($file_path, $file_name)
{
try {
$ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
$result = $ossClient->uploadFile($this->bucket, $file_name, $file_path);//$result['info']['url'] 返回上传成功的oss文件地址
$arr = array(
'oss_file' =>$result['info']['url'],
'local_path' => $file_name
);
return $arr;
} catch (OssException $e) {
// printf(__FUNCTION__ . ": FAILED\n");
// printf($e->getMessage() . "\n");
log_msg('文件上传失败',$e->getMessage());
log_msg('文件上传失败',$file_path.'---'.$file_name);
return false;
}
}
}
至此,OSS文件上传就完成了,具体使用过程中有什么问题,可随时反馈,同时也欢迎提出各种建议,谢谢!

PHP实现阿里云OSS文件上传(支持批量)的更多相关文章

  1. 构建基于阿里云OSS文件上传服务

    转载请注明来源:http://blog.csdn.net/loongshawn/article/details/50710132 <构建基于阿里云OSS文件上传服务> <构建基于OS ...

  2. 记一次阿里云oss文件上传服务假死

    引言 记得以前刚开始学习web项目的时候,经常涉及到需要上传图片啥的,那时候都是把图片上传到当前项目文件夹下面,每次项目一重启图片就丢了.虽然可以通过修改/tomcat/conf/server.xml ...

  3. SpringBoot整合阿里云OSS文件上传、下载、查看、删除

    1. 开发前准备 1.1 前置知识 java基础以及SpringBoot简单基础知识即可. 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lom ...

  4. php阿里云oss文件上传

    php的文件上传 文件上传 php的文件上传放在了$_FILES数组里,单文件和多文件上传的区别在于$_FILES['userfile']['name']是否为数组, 不熟悉的可以读一下官方文档 单文 ...

  5. 阿里云OSS文件上传封装

    1.先用composer安装阿里云OSS的PHPSDK 2.配置文件里定义阿里云OSS的秘钥 3.在index控制器里的代码封装 <?php namespace app\index\contro ...

  6. 记录-阿里云Oss文件上传

    public class OssUtil { /** * 上传图片 * @param file * @param request * @return */ public static Map<S ...

  7. Thinkphp整合阿里云OSS图片上传实例

    Thinkphp3.2整合阿里云OSS图片上传实例,图片上传至OSS可减少服务器压力,节省宽带,安全又稳定,阿里云OSS对于做负载均衡非常方便,不用传到各个服务器了 首先引入阿里云OSS类库 < ...

  8. .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件

    asp.net mvc请移步 mvc文件上传支持批量上传,拖拽以及预览,文件内容校验 本篇内容主要解决.net core中文件上传的问题  开发环境:ubuntu+vscode 1.导入所需要的包:n ...

  9. SpringBoot完美配置阿里云的文件上传

    新建一个config类 AliyunOSS.java @Configuration @Data public class AliyunOSS { private OSSClient ossClient ...

随机推荐

  1. APP自動化測試腳本3

    package com.lemon.day01; import java.net.MalformedURLException; import java.net.URL; import java.uti ...

  2. 怎样用手机把视频变成GIF表情包?原来那么简单,网友:看完涨知识了

    现如今表情包几乎成了,我们手机聊天的必需品了.不过相比于普通表情包,大家更喜欢用GIF表情包,因为动图表情包不仅更加搞笑,而且能更形象的表达我们的情绪.比较有想法的朋友甚至想自己制作GIF表情包,但是 ...

  3. Linux 中文打字软件 gtypist 光标错位解决

    在windows 下有 金山打字和其他的跟打软件,在Linux下找到了 gtypist 为练习中文打字,该软件分为练习模式的速度测试模式,在gtypist-2.9.5版中会出现以下几个问题: 一是在练 ...

  4. hadoop之mapreduce详解(优化篇)

    一.概述 优化前我们需要知道hadoop适合干什么活,适合什么场景,在工作中,我们要知道业务是怎样的,能才结合平台资源达到最有优化.除了这些我们当然还要知道mapreduce的执行过程,比如从文件的读 ...

  5. python自动化测试三部曲之untitest框架

    终于等到十一,有时间写博客了,准备利用十一这几天的假期把这个系列的博客写完 该系列文章本人准备写三篇博客 第一篇:介绍python自动化测试框架unittest 第二篇:介绍django框架+requ ...

  6. ReactNative实现GridView

    ReactNative内置了ListView组件但是没有类似GridView这样的组件.利用一些已经有的属性是可以实现GridView的,利用ContentContainerStyle的属性然后配合样 ...

  7. ajax跨域访问数据

    通过json发送和接受数据,数据以json的格式在服务器端和前台进行传递,什么是json数据?这里就不进行详细阐述,轻自行百度解决. 在html5 中利用ajax 异步请求时,会遇到跨域的问题,如果域 ...

  8. Python基础(十六)

    今日主要内容 内置模块(标准库) 序列化 hashlib collections 软件开发规范 一.内置模块(标准库) (一)序列化模块 什么是序列化? 将一种数据结构(如列表.字典)转换为另一种特殊 ...

  9. [WP8.1]给Pivot的Header加上颜色

    先上个效果图 以前想实现这个给Pivot加颜色时只找到8的,通过参考8的实现方式,8.1的实现如下,在Pivot的样式上做一些修改,如下图的红框处 另外如果要改Pivot的Header里文字的颜色又要 ...

  10. Windows 10 删除C盘的用户,恢复技巧

    起因 入域不成功,然后强制删除了C盘 Users里面 账户 然后再进行入域的时候就入域不成功了,如果再进行登录就会提示 无法登录到你的账户 通常可以通过从你的账户注销,然后重新登录解决此问题 如果不立 ...