原生PHP单文件上传路径获取与文件流的保存

方法一:

<?php
//图片上传与入库
include 'config.php';

try{
    //非正常上传(恶意攻击)
    if(!is_uploaded_file($_FILES['img']['tmp_name'])){
        //抛出异常
        throw new Exception('非正常上传');
    }
    //文件上传有误
    if($_FILES['img']['error']!= 0){
        throw new Exception('文件上传有误');
    }
    //文件最大2M
    $maxsize = 2*1024*1024;
    if($_FILES['img']['size']>$maxsize){
        throw new Exception('文件最大2M');
    }
    //获取文件后缀
    $srcname = $_FILES['img']['name'];
    $ext = array_pop(explode('.',$srcname));
    //文件类型为png、jpg、gif
    $types = ['png','jpg','gif'];
    if(!in_array($ext,$types)){
        throw new Exception('文件类型必须为png、jpg和gif');
    }
    //源文件和目标文件
    $srcfile = $_FILES['img']['tmp_name'];
    $dstname = time().mt_rand().'.'.$ext;
    $dstfile = 'public/uploads/'.$dstname;
    //文件移动
    if(move_uploaded_file($srcfile,$dstfile)){
        //数据入库
        $sql = "insert into yzm_img(name) values('{$dstname}')";
        $smt = $pdo->prepare($sql);
        if($smt->execute()){
            //跳转到首页
            header('location:index.php');
        }
    }
}catch (Exception $e){
    //错误提示
   echo  $e->getMessage();
   exit;
}

方法二:

假设上传的文件name值为upload

<form id="comment"  action="{:url('supplement_order/index')}" method="post" enctype="multipart/form-data">
<input type="file" name="file_name" value="" >

<button class="submit" >提交</button>
</form>

服务端处理代码如下:

if(isset($_FILES['file_name']) && !$_FILES['file_name']['error']) {// 文件存在且不报错
                 $fileName = $_FILES['file_name']['name']; // 获取文件
                 $fileExtension = pathinfo($fileName);  // 获取文件路径信息
                 $fileExtension = $fileExtension['extension']; // 获取文件后缀
                 $time = time(); // 根据时间戳区分
                 $destinationPath = "./upload/supplement_order/xlsx_ledge/";  // 目标文件夹
                 $newFileName = $destinationPath.$time.".".$fileExtension;
                 // 完整的url
                 if(rename($_FILES['file_name']['tmp_name'], $newFileName)) {       // 移动文件到目标路径
                     echo("文件移动成功");
                 } else {
                     die("文件路径出错");
                 }
             }

参考文档:
https://www.cnblogs.com/sysuzjz/p/4289309.html

实现最安全的文件上传需要考虑以下几个方面: 1. 文件类型过滤:只允许上传指定类型的文件,比如图片、文档、音频等,可以使用 MIME 类型或文件扩展名进行判断。 2. 文件大小限制:限制上传文件的大小,避免占用过多的服务器资源和网络带宽。 3. 防止文件覆盖:检查上传的文件名是否已经存在,如果存在则重命名或者提示用户重新上传。 4. 防止文件注入:对上传的文件进行严格的检查和过滤,避免上传恶意文件或包含恶意代码的文件。 下面是一个使用原生 PHP 实现文件上传的示例代码,包含了上述安全措施: ```php <?php // 允许上传的文件类型 $allowedTypes = ['jpg', 'jpeg', 'png', 'gif']; // 允许上传的文件大小,位字节 $maxSize = 1024 * 1024 * 2; // 上传文件保存路径 $uploadPath = './uploads/'; if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 检查上传文件是否存在且上传成功 if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) { // 获取上传文件的信息 $fileName = $_FILES['file']['name']; $fileType = pathinfo($fileName, PATHINFO_EXTENSION); $fileSize = $_FILES['file']['size']; $fileTmpName = $_FILES['file']['tmp_name']; // 检查文件类型是否允许上传 if (!in_array($fileType, $allowedTypes)) { die('不允许上传该类型的文件'); } // 检查文件大小是否超出限制 if ($fileSize > $maxSize) { die('文件大小超出限制'); } // 生成新的文件名,避免文件名冲突 $newFileName = uniqid() . '.' . $fileType; // 移动上传文件到指定目录 if (move_uploaded_file($fileTmpName, $uploadPath . $newFileName)) { echo '文件上传成功'; } else { die('文件上传失败'); } } else { die('上传文件不存在或上传失败'); } } ?> ``` 上述代码中,我们通过判断上传文件的类型、大小、以及是否存在来保证文件上传的安全性。同时,我们还使用了 `uniqid()` 函数生成了一个唯一的文件名,避免了文件名冲突的问题。最后,我们通过 `move_uploaded_file()` 函数将上传的文件移动到指定的目录,确保文件上传成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值