tp6上传文件大小超过了最大值+验证文件上传大小和格式函数

问题:

最近用tp6的文件上传方法上传文件时报文件过大错误。如下所示:

 $file = $this->request->file('file');
{
	"code": 1,
	"msg": "上传文件大小超过了最大值!",
	"data": {
		"code": 1,
		"line": 1232,
		"file": "D:\\myweb\\ytems\\vendor\\topthink\\framework\\src\\think\\Request.php",
		"message": "上传文件大小超过了最大值!"
    }
}

解决:

1、php.ini 配置

修改 upload_max_filesize = 10M 值为合适的大小

;;;;;;;;;;;;;;;;
; 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 =

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

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

2、 确认TP6框架的文件上传限制配置

TP6框架本身对文件上传有一定的限制,这个限制可以在配置文件中进行设置。你需要检查并修改以下配置文件:

  • config/filesystem.php‌:这个文件通常包含了文件上传的相关配置。你可以找到类似max_filesize的配置项,并将其设置为一个更大的值。例如:
    return [
        // ...
        'disks' => [
            'public' => [
                // ...
                'max_filesize' => '20M', // 设置为你需要的最大值
            ],
            // ...
        ],
        // ...
    ];
    

3、构建验证文件上传大小和格式的函数 

调用函数:

$file = $this->request->file('file');
//校验图片 
$checkFile = checkUploadFile($file, 2, ['jpg','jpeg','png']);
if($checkFile['code'] != 200){
    return error($checkFile['msg']);
}
/**
 * 判断上传文件是否合法   如:php文件不可上传
 *
 * @author
 * @param $file
 * @param $only_php_check  是否仅检查非php文件
 * @param $allowed_types  允许的文件类型
 * @param $allowed_extensions  允许的文件扩展名
 * @param $from_allowed_size  允许的文件大小 单位 M
 * @return  array
 */
function checkUploadFile($file,  $from_allowed_size=2, $allowed_extensions=[], $only_php_check=false) {

    $allowed_size = $from_allowed_size * 1024 * 1024;

    if (!isset($file)) {
        return false;
    }

    $check_php = true;

    //允许的文件类型(mimeType): application/vnd.ms-excel
    //不允许的类型 text/x-php
    $mime_type = strtolower($file->getMime());//text/x-php
    $extension = strtolower($file->getOriginalExtension());//php
    $file_size = $file->getSize();

    if($mime_type == 'text/x-php' || $extension == 'php'){
        $check_php = false;//上传文件为php文件
    }

    if($only_php_check){//仅判断是否为php文件的话 此时就返回结果。终止后续判断了。
        if($check_php){
            return ['code'=>200, 'msg'=>'上传成功'];
        }else{
            return ['code'=>4003, 'msg'=>'非法上传文件'];//为 php文件
        }

    }

    // 允许的MIME类型数组和扩展名数组
    if(!$allowed_extensions){
        $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'xls'];
        $allowed_types = ['image/jpeg', 'image/png', 'image/gif', 'application/vnd.ms-excel'];
    }else{
        $allowed_types = [];
        foreach ($allowed_extensions as $k=>&$v) {
            switch($v){
                case 'jpg':
                case 'jpeg':
                    $allowed_types[$k] = 'image/jpeg';
                    break;
                case 'png':
                    $allowed_types[$k] = 'image/png';
                    break;
                case 'gif':
                    $allowed_types[$k] = 'image/gif';
                    break;
                case 'xls':
                    $allowed_types[$k] = 'application/vnd.ms-excel';
                    break;
                default:
                    $allowed_types[$k] = $v;
                    break;
            }
        }
    }

    if($file_size > $allowed_size){
        return ['code'=>4002, 'msg'=>'上传文件尺寸不可大于'.$from_allowed_size.'M'];
    }

    // 检查MIME类型和扩展名是否都在允许的列表中
    if (in_array($mime_type, $allowed_types) && in_array($extension, $allowed_extensions)) {
        return ['code'=>200, 'msg'=>'上传成功'];
    } else {
        return ['code'=>4001, 'msg'=>'上传图片格式不正确'];
    }

}

<think>我们之前已经实现了在最小值最大值之间均匀生成多个切面的功能。现在用户希望了解如何在最小值最大值之间的中间切面进行操作,而不是在极值处进行切面。实际上,我们之前生成的切面已经包括了中间切面(因为我们在整个范围内均匀分布)。但是,用户可能特指排除最小值最大值这两个端点,只处理中间切面。因此,我们可以调整切面生成的位置,使其不包含最小值最大值这两个端点。例如,如果用户指定10个切面,我们可以在最小值与最大值之间生成10个切面,但这些切面都不包括最小值最大值本身。修改思路:1.仍然使用`z_min``z_max`作为范围。2.生成切面位置时,排除两个端点。我们可以通过调整`np.linspace`的起始结束位置来实现:从`z_min+step/2`开始,到`z_max-step/2`结束?或者更一般地,我们可以在区间内均匀分布但不包括端点。注意:`np.linspace`默认包括端点(即`endpoint=True`)。我们可以设置`endpoint=False`,这样生成的数组将不包括最大值。但是这样生成的切面是从`z_min`开始,到`z_max-step`结束。这并不完全符合要求,因为我们希望排除最小值,同时排除最大值。另一种方法是:生成从`z_min+step`到`z_max-step`的等间距点,其中`step=(z_max-z_min)/(num_slices+1)`。这样我们就在中间生成了`num_slices`个切面,且都不包含端点。具体步骤:设切面数量为`n`,则整个区间被分成`n+1`段,每段长度为:$d=\frac{z_{\text{max}}-z_{\text{min}}}{n+1}$那么切面位置为:$z_i=z_{\text{min}}+i\timesd$,其中$i$从1到$n$。例如,当`n=10`时,我们生成10个切面,位置分别在:z_min+d,z_min+2d,...,z_min+10d(注意:z_min+10d=z_min+10*((z_max-z_min)/11)=z_min+(10/11)(z_max-z_min)<z_max)这样我们就避开了两个端点。修改代码:原代码:abs_positions=np.linspace(z_min,z_max,num_slices)修改后:d=(z_max-z_min)/(num_slices+1)abs_positions=[z_min+i*dforiinrange(1,num_slices+1)]或者使用numpy:abs_positions=np.linspace(z_min+d,z_max-d,num_slices)#注意:这样写实际上也是等间距,但需要计算d但更直接的是:abs_positions=np.linspace(z_min,z_max,num_slices+2)[1:-1]解释:先生成包括端点的`num_slices+2`个点(即两端点加上中间的`num_slices`个点,共`num_slices+2`个点),然后去掉第一个最后一个(即端点),剩下的就是中间切面的位置。三种方法都可以,我们选择一种清晰的方法。下面我们修改代码,只生成中间切面(不包含最小值最大值处的切面)。注意:用户可能希望切面数量仍然是`num_slices`,但排除端点。修改后的代码片段:```python#生成均匀分布的切面位置(使用绝对坐标),但不包括最小值最大值abs_positions=np.linspace(z_min,z_max,num_slices+2)[1:-1]```这样我们就得到了`num_slices`个在区间内部的切面位置。完整代码修改如下:</think>### 如何在最小值最大值之间的中间切面进行处理 在数据处理中,避免在极值处(最小值最大值)切面,专注于中间区域的处理,可以通过以下方法实现: #### 1. **中间区域定义** 定义中间区域为整个数据范围的中间80%,排除两端各10%的极值区: ```python # 计算中间区域范围 margin = 0.1 * (z_max - z_min) # 两端各排除10% mid_min = z_min + margin mid_max = z_max - margin ``` #### 2. **中间切面生成** 在中间区域均匀生成切面(排除极值区): ```python # 生成中间区域的切面 num_mid_slices = 8 # 中间区域切面数量 mid_positions = np.linspace(mid_min, mid_max, num_mid_slices) # 创建中间切面 for z_pos in mid_positions: tp.data.extract.extract_slice( position=z_pos, slice_surface=tp.constant.SliceSurface.ZPlanes ) ``` #### 3. **梯度加权切面分布** 根据数据梯度动态调整切面密度(梯度大的区域密集采样): ```python from scipy import ndimage # 计算Z方向梯度 gradient = ndimage.sobel(dataset.zone(0).values('Z')) grad_norm = (gradient - np.min(gradient)) / (np.max(gradient) - np.min(gradient)) # 梯度加权的切面分布 weights = grad_norm * 0.8 + 0.2 # 确保最小权重 cum_weights = np.cumsum(weights) cum_weights /= cum_weights[-1] # 生成非均匀分布的切面位置 num_slices = 10 positions = mid_min + (mid_max - mid_min) * cum_weights[np.linspace(0, len(grad_norm)-1, num_slices).astype(int)] ``` #### 4. **中间切面处理技术** 对中间切面进行特殊处理: ```python for i, slice_obj in enumerate(plot.slices()): if mid_min <= slice_obj.position <= mid_max: # 仅处理中间切面 # 应用增强对比度 slice_obj.contour.colormap_filter.contrast = 1.5 # 添加特殊标注 slice_obj.edge.color = tp.constant.Color.Red slice_obj.edge.line_thickness = 0.8 # 提取切面数据进行独立分析 slice_data = slice_obj.dataset analyze_mid_slice(slice_data) # 自定义分析函数 ``` #### 5. **数学原理** 中间区域切面位置计算: $$ z_i = z_{\text{min}} + \delta + \frac{i}{n-1} \times (z_{\text{max}} - z_{\text{min}} - 2\delta) $$ 其中: - $\delta = k \times (z_{\text{max}} - z_{\text{min}})$ 为边界排除量 ($k=0.1$) - $i = 0,1,2,\dots,n-1$ - $n$ 为中间切面数量 ### 应用场景 1. **焊接质量检测** 排除焊缝起始/结束端的温度异常区,专注分析中间稳定焊接区[^5] 2. **流体动力学分析** 避免边界层效应,研究主流区域的流动特性 3. **材料应力分析** 排除夹持端的影响,分析试件中段的真实应力分布 ```mermaid graph LR A[原始数据范围 z_min~z_max] --> B[排除极值区] B --> C[中间区域 mid_min~mid_max] C --> D[均匀切面采样] C --> E[梯度加权采样] D --> F[中间切面分析] E --> F F --> G[特征提取] F --> H[异常检测] ``` ### 注意事项 1. **边界过渡处理** 在中间区域边界处添加平滑过渡,避免突变: ```python # 应用汉宁窗平滑 window = np.hanning(len(mid_positions)) weighted_positions = mid_min + (mid_max - mid_min) * window ``` 2. **多区域数据协调** 当处理多区域数据时,需统一中间区域定义: ```python global_mid_min = max([zone.values('Z').min() + margin for zone in dataset.zones()]) global_mid_max = min([zone.values('Z').max() - margin for zone in dataset.zones()]) ``` 3. **结果验证** 添加中间切面有效性检查: ```python for slice_obj in plot.slices(): pos = slice_obj.position assert mid_min <= pos <= mid_max, "切面超出中间区域范围" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值