찾다
백엔드 개발PHP 튜토리얼Thinkphp 업로드 클래스는 사진 업로드를 위한 코드를 구현합니다.

本篇文章给大家带来的内容是关于Thinkphp上传类实现上传图片的代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

thinkphp如何上传图片呢?下面就为大家详细介绍下!

1、封装上传类方法

<?php
//调用上传
public function uploadUser(){
   $banner=$this->uploadYmdImg(&#39;ymd_banner&#39;);
   if(!empty($banner)){
	  $data[&#39;ymd_banner&#39;]=$banner;
   }
}
   /*
 * 封装图片上传
 * */	
public function uploadYmdImg($fileName,$route="banner"){
	if(!empty($_FILES[$fileName][&#39;tmp_name&#39;])){
		    $upload = new \Think\Upload();// 实例化上传类
		    $upload->maxSize   =     3145728 ;// 设置附件上传大小
		    $upload->exts      =     array(&#39;jpg&#39;, &#39;gif&#39;, &#39;png&#39;, &#39;jpeg&#39;);// 设置附件上传类型
		    $upload->rootPath  =      &#39;./Upload/&#39;.$route.&#39;/&#39;; // 设置附件上传根目录
		    // 上传单个文件 
		    $info   =   $upload->uploadOne($_FILES[$fileName]);
		    if(!$info) {// 上传错误提示错误信息
		        $this->error($upload->getError());
		    }else{// 上传成功 获取上传文件信息
		        return C(&#39;TMPL_PARSE_STRING.__YIMUDI__&#39;).&#39;/Upload/&#39;.$route.&#39;/&#39;.$info[&#39;savepath&#39;].$info[&#39;savename&#39;];
		   }			
	}else{
		return NULL;
	}		
}

2、Thinkphp内部定义的上传类

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
namespace Think;
class Upload {
    /**
     * 默认上传配置
     * @var array
     */
    private $config = array(
        &#39;mimes&#39;         =>  array(), //允许上传的文件MiMe类型
        &#39;maxSize&#39;       =>  0, //上传的文件大小限制 (0-不做限制)
        &#39;exts&#39;          =>  array(), //允许上传的文件后缀
        &#39;autoSub&#39;       =>  true, //自动子目录保存文件
        &#39;subName&#39;       =>  array(&#39;date&#39;, &#39;Y-m-d&#39;), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
        &#39;rootPath&#39;      =>  &#39;./Uploads/&#39;, //保存根路径
        &#39;savePath&#39;      =>  &#39;&#39;, //保存路径
        &#39;saveName&#39;      =>  array(&#39;uniqid&#39;, &#39;&#39;), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
        &#39;saveExt&#39;       =>  &#39;&#39;, //文件保存后缀,空则使用原后缀
        &#39;replace&#39;       =>  false, //存在同名是否覆盖
        &#39;hash&#39;          =>  true, //是否生成hash编码
        &#39;callback&#39;      =>  false, //检测文件是否存在回调,如果存在返回文件信息数组
        &#39;driver&#39;        =>  &#39;&#39;, // 文件上传驱动
        &#39;driverConfig&#39;  =>  array(), // 上传驱动配置
    );

    /**
     * 上传错误信息
     * @var string
     */
    private $error = &#39;&#39;; //上传错误信息

    /**
     * 上传驱动实例
     * @var Object
     */
    private $uploader;

    /**
     * 构造方法,用于构造上传实例
     * @param array  $config 配置
     * @param string $driver 要使用的上传驱动 LOCAL-本地上传驱动,FTP-FTP上传驱动
     */
    public function __construct($config = array(), $driver = &#39;&#39;, $driverConfig = null){
        /* 获取配置 */
        $this->config   =   array_merge($this->config, $config);

        /* 设置上传驱动 */
        $this->setDriver($driver, $driverConfig);

        /* 调整配置,把字符串配置参数转换为数组 */
        if(!empty($this->config[&#39;mimes&#39;])){
            if(is_string($this->mimes)) {
                $this->config[&#39;mimes&#39;] = explode(&#39;,&#39;, $this->mimes);
            }
            $this->config[&#39;mimes&#39;] = array_map(&#39;strtolower&#39;, $this->mimes);
        }
        if(!empty($this->config[&#39;exts&#39;])){
            if (is_string($this->exts)){
                $this->config[&#39;exts&#39;] = explode(&#39;,&#39;, $this->exts);
            }
            $this->config[&#39;exts&#39;] = array_map(&#39;strtolower&#39;, $this->exts);
        }
    }

    /**
     * 使用 $this->name 获取配置
     * @param  string $name 配置名称
     * @return multitype    配置值
     */
    public function __get($name) {
        return $this->config[$name];
    }

    public function __set($name,$value){
        if(isset($this->config[$name])) {
            $this->config[$name] = $value;
            if($name == &#39;driverConfig&#39;){
                //改变驱动配置后重置上传驱动
                //注意:必须选改变驱动然后再改变驱动配置
                $this->setDriver(); 
            }
        }
    }

    public function __isset($name){
        return isset($this->config[$name]);
    }

    /**
     * 获取最后一次上传错误信息
     * @return string 错误信息
     */
    public function getError(){
        return $this->error;
    }

    /**
     * 上传单个文件
     * @param  array  $file 文件数组
     * @return array        上传成功后的文件信息
     */
    public function uploadOne($file){
        $info = $this->upload(array($file));
        return $info ? $info[0] : $info;
    }

    /**
     * 上传文件
     * @param 文件信息数组 $files ,通常是 $_FILES数组
     */
    public function upload($files=&#39;&#39;) {
        if(&#39;&#39; === $files){
            $files  =   $_FILES;
        }
        if(empty($files)){
            $this->error = &#39;没有上传的文件!&#39;;
            return false;
        }

        /* 检测上传根目录 */
        if(!$this->uploader->checkRootPath($this->rootPath)){
            $this->error = $this->uploader->getError();
            return false;
        }

        /* 检查上传目录 */
        if(!$this->uploader->checkSavePath($this->savePath)){
            $this->error = $this->uploader->getError();
            return false;
        }

        /* 逐个检测并上传文件 */
        $info    =  array();
        if(function_exists(&#39;finfo_open&#39;)){
            $finfo   =  finfo_open ( FILEINFO_MIME_TYPE );
        }
        // 对上传文件数组信息处理
        $files   =  $this->dealFiles($files);    
        foreach ($files as $key => $file) {
            $file[&#39;name&#39;]  = strip_tags($file[&#39;name&#39;]);
            if(!isset($file[&#39;key&#39;]))   $file[&#39;key&#39;]    =   $key;
            /* 通过扩展获取文件类型,可解决FLASH上传$FILES数组返回文件类型错误的问题 */
            if(isset($finfo)){
                $file[&#39;type&#39;]   =   finfo_file ( $finfo ,  $file[&#39;tmp_name&#39;] );
            }

            /* 获取上传文件后缀,允许上传无后缀文件 */
            $file[&#39;ext&#39;]    =   pathinfo($file[&#39;name&#39;], PATHINFO_EXTENSION);

            /* 文件上传检测 */
            if (!$this->check($file)){
                continue;
            }

            /* 获取文件hash */
            if($this->hash){
                $file[&#39;md5&#39;]  = md5_file($file[&#39;tmp_name&#39;]);
                $file[&#39;sha1&#39;] = sha1_file($file[&#39;tmp_name&#39;]);
            }

            /* 调用回调函数检测文件是否存在 */
            $data = call_user_func($this->callback, $file);
            if( $this->callback && $data ){
                if ( file_exists(&#39;.&#39;.$data[&#39;path&#39;])  ) {
                    $info[$key] = $data;
                    continue;
                }elseif($this->removeTrash){
                    call_user_func($this->removeTrash,$data);//删除垃圾据
                }
            }

            /* 生成保存文件名 */
            $savename = $this->getSaveName($file);
            if(false == $savename){
                continue;
            } else {
                $file[&#39;savename&#39;] = $savename;
            }

            /* 检测并创建子目录 */
            $subpath = $this->getSubPath($file[&#39;name&#39;]);
            if(false === $subpath){
                continue;
            } else {
                $file[&#39;savepath&#39;] = $this->savePath . $subpath;
            }

            /* 对图像文件进行严格检测 */
            $ext = strtolower($file[&#39;ext&#39;]);
            if(in_array($ext, array(&#39;gif&#39;,&#39;jpg&#39;,&#39;jpeg&#39;,&#39;bmp&#39;,&#39;png&#39;,&#39;swf&#39;))) {
                $imginfo = getimagesize($file[&#39;tmp_name&#39;]);
                if(empty($imginfo) || ($ext == &#39;gif&#39; && empty($imginfo[&#39;bits&#39;]))){
                    $this->error = &#39;非法图像文件!&#39;;
                    continue;
                }
            }

            /* 保存文件 并记录保存成功的文件 */
            if ($this->uploader->save($file,$this->replace)) {
                unset($file[&#39;error&#39;], $file[&#39;tmp_name&#39;]);
                $info[$key] = $file;
            } else {
                $this->error = $this->uploader->getError();
            }
        }
        if(isset($finfo)){
            finfo_close($finfo);
        }
        return empty($info) ? false : $info;
    }

    /**
     * 转换上传文件数组变量为正确的方式
     * @access private
     * @param array $files  上传的文件变量
     * @return array
     */
    private function dealFiles($files) {
        $fileArray  = array();
        $n          = 0;
        foreach ($files as $key=>$file){
            if(is_array($file[&#39;name&#39;])) {
                $keys       =   array_keys($file);
                $count      =   count($file[&#39;name&#39;]);
                for ($i=0; $i<$count; $i++) {
                    $fileArray[$n][&#39;key&#39;] = $key;
                    foreach ($keys as $_key){
                        $fileArray[$n][$_key] = $file[$_key][$i];
                    }
                    $n++;
                }
            }else{
               $fileArray = $files;
               break;
            }
        }
       return $fileArray;
    }

    /**
     * 设置上传驱动
     * @param string $driver 驱动名称
     * @param array $config 驱动配置     
     */
    private function setDriver($driver = null, $config = null){
        $driver = $driver ? : ($this->driver       ? : C(&#39;FILE_UPLOAD_TYPE&#39;));
        $config = $config ? : ($this->driverConfig ? : C(&#39;UPLOAD_TYPE_CONFIG&#39;));
        $class = strpos($driver,&#39;\\&#39;)? $driver : &#39;Think\\Upload\\Driver\\&#39;.ucfirst(strtolower($driver));
        $this->uploader = new $class($config);
        if(!$this->uploader){
            E("不存在上传驱动:{$name}");
        }
    }

    /**
     * 检查上传的文件
     * @param array $file 文件信息
     */
    private function check($file) {
        /* 文件上传失败,捕获错误代码 */
        if ($file[&#39;error&#39;]) {
            $this->error($file[&#39;error&#39;]);
            return false;
        }

        /* 无效上传 */
        if (empty($file[&#39;name&#39;])){
            $this->error = &#39;未知上传错误!&#39;;
        }

        /* 检查是否合法上传 */
        if (!is_uploaded_file($file[&#39;tmp_name&#39;])) {
            $this->error = &#39;非法上传文件!&#39;;
            return false;
        }

        /* 检查文件大小 */
        if (!$this->checkSize($file[&#39;size&#39;])) {
            $this->error = &#39;上传文件大小不符!&#39;;
            return false;
        }

        /* 检查文件Mime类型 */
        //TODO:FLASH上传的文件获取到的mime类型都为application/octet-stream
        if (!$this->checkMime($file[&#39;type&#39;])) {
            $this->error = &#39;上传文件MIME类型不允许!&#39;;
            return false;
        }

        /* 检查文件后缀 */
        if (!$this->checkExt($file[&#39;ext&#39;])) {
            $this->error = &#39;上传文件后缀不允许&#39;;
            return false;
        }

        /* 通过检测 */
        return true;
    }


    /**
     * 获取错误代码信息
     * @param string $errorNo  错误号
     */
    private function error($errorNo) {
        switch ($errorNo) {
            case 1:
                $this->error = &#39;上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值!&#39;;
                break;
            case 2:
                $this->error = &#39;上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值!&#39;;
                break;
            case 3:
                $this->error = &#39;文件只有部分被上传!&#39;;
                break;
            case 4:
                $this->error = &#39;没有文件被上传!&#39;;
                break;
            case 6:
                $this->error = &#39;找不到临时文件夹!&#39;;
                break;
            case 7:
                $this->error = &#39;文件写入失败!&#39;;
                break;
            default:
                $this->error = &#39;未知上传错误!&#39;;
        }
    }

    /**
     * 检查文件大小是否合法
     * @param integer $size 数据
     */
    private function checkSize($size) {
        return !($size > $this->maxSize) || (0 == $this->maxSize);
    }

    /**
     * 检查上传的文件MIME类型是否合法
     * @param string $mime 数据
     */
    private function checkMime($mime) {
        return empty($this->config[&#39;mimes&#39;]) ? true : in_array(strtolower($mime), $this->mimes);
    }

    /**
     * 检查上传的文件后缀是否合法
     * @param string $ext 后缀
     */
    private function checkExt($ext) {
        return empty($this->config[&#39;exts&#39;]) ? true : in_array(strtolower($ext), $this->exts);
    }

    /**
     * 根据上传文件命名规则取得保存文件名
     * @param string $file 文件信息
     */
    private function getSaveName($file) {
        $rule = $this->saveName;
        if (empty($rule)) { //保持文件名不变
            /* 解决pathinfo中文文件名BUG */
            $filename = substr(pathinfo("_{$file[&#39;name&#39;]}", PATHINFO_FILENAME), 1);
            $savename = $filename;
        } else {
            $savename = $this->getName($rule, $file[&#39;name&#39;]);
            if(empty($savename)){
                $this->error = &#39;文件命名规则错误!&#39;;
                return false;
            }
        }

        /* 文件保存后缀,支持强制更改文件后缀 */
        $ext = empty($this->config[&#39;saveExt&#39;]) ? $file[&#39;ext&#39;] : $this->saveExt;

        return $savename . &#39;.&#39; . $ext;
    }

    /**
     * 获取子目录的名称
     * @param array $file  上传的文件信息
     */
    private function getSubPath($filename) {
        $subpath = &#39;&#39;;
        $rule    = $this->subName;
        if ($this->autoSub && !empty($rule)) {
            $subpath = $this->getName($rule, $filename) . &#39;/&#39;;

            if(!empty($subpath) && !$this->uploader->mkdir($this->savePath . $subpath)){
                $this->error = $this->uploader->getError();
                return false;
            }
        }
        return $subpath;
    }

    /**
     * 根据指定的规则获取文件或目录名称
     * @param  array  $rule     规则
     * @param  string $filename 原文件名
     * @return string           文件或目录名称
     */
    private function getName($rule, $filename){
        $name = &#39;&#39;;
        if(is_array($rule)){ //数组规则
            $func     = $rule[0];
            $param    = (array)$rule[1];
            foreach ($param as &$value) {
               $value = str_replace(&#39;__FILE__&#39;, $filename, $value);
            }
            $name = call_user_func_array($func, $param);
        } elseif (is_string($rule)){ //字符串规则
            if(function_exists($rule)){
                $name = call_user_func($rule);
            } else {
                $name = $rule;
            }
        }
        return $name;
    }

}

相关推荐: 

php实现生成混合验证码与图像验证码并测试(代码)

tp5实现批量上传图片的方法代码

위 내용은 Thinkphp 업로드 클래스는 사진 업로드를 위한 코드를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP : 서버 측 스크립팅 언어 소개PHP : 서버 측 스크립팅 언어 소개Apr 16, 2025 am 12:18 AM

PHP는 동적 웹 개발 및 서버 측 응용 프로그램에 사용되는 서버 측 스크립팅 언어입니다. 1.PHP는 편집이 필요하지 않으며 빠른 발전에 적합한 해석 된 언어입니다. 2. PHP 코드는 HTML에 포함되어 웹 페이지를 쉽게 개발할 수 있습니다. 3. PHP는 서버 측 로직을 처리하고 HTML 출력을 생성하며 사용자 상호 작용 및 데이터 처리를 지원합니다. 4. PHP는 데이터베이스와 상호 작용하고 프로세스 양식 제출 및 서버 측 작업을 실행할 수 있습니다.

PHP 및 웹 : 장기적인 영향 탐색PHP 및 웹 : 장기적인 영향 탐색Apr 16, 2025 am 12:17 AM

PHP는 지난 수십 년 동안 네트워크를 형성했으며 웹 개발에서 계속 중요한 역할을 할 것입니다. 1) PHP는 1994 년에 시작되었으며 MySQL과의 원활한 통합으로 인해 개발자에게 최초의 선택이되었습니다. 2) 핵심 기능에는 동적 컨텐츠 생성 및 데이터베이스와의 통합이 포함되며 웹 사이트를 실시간으로 업데이트하고 맞춤형 방식으로 표시 할 수 있습니다. 3) PHP의 광범위한 응용 및 생태계는 장기적인 영향을 미쳤지 만 버전 업데이트 및 보안 문제에 직면 해 있습니다. 4) PHP7의 출시와 같은 최근 몇 년간의 성능 향상을 통해 현대 언어와 경쟁 할 수 있습니다. 5) 앞으로 PHP는 컨테이너화 및 마이크로 서비스와 같은 새로운 도전을 다루어야하지만 유연성과 활발한 커뮤니티로 인해 적응력이 있습니다.

PHP를 사용하는 이유는 무엇입니까? 설명 된 장점과 혜택PHP를 사용하는 이유는 무엇입니까? 설명 된 장점과 혜택Apr 16, 2025 am 12:16 AM

PHP의 핵심 이점에는 학습 용이성, 강력한 웹 개발 지원, 풍부한 라이브러리 및 프레임 워크, 고성능 및 확장 성, 크로스 플랫폼 호환성 및 비용 효율성이 포함됩니다. 1) 배우고 사용하기 쉽고 초보자에게 적합합니다. 2) 웹 서버와 우수한 통합 및 여러 데이터베이스를 지원합니다. 3) Laravel과 같은 강력한 프레임 워크가 있습니다. 4) 최적화를 통해 고성능을 달성 할 수 있습니다. 5) 여러 운영 체제 지원; 6) 개발 비용을 줄이기위한 오픈 소스.

신화를 폭로 : PHP가 실제로 죽은 언어입니까?신화를 폭로 : PHP가 실제로 죽은 언어입니까?Apr 16, 2025 am 12:15 AM

PHP는 죽지 않았습니다. 1) PHP 커뮤니티는 성능 및 보안 문제를 적극적으로 해결하고 PHP7.x는 성능을 향상시킵니다. 2) PHP는 최신 웹 개발에 적합하며 대규모 웹 사이트에서 널리 사용됩니다. 3) PHP는 배우기 쉽고 서버가 잘 수행되지만 유형 시스템은 정적 언어만큼 엄격하지 않습니다. 4) PHP는 컨텐츠 관리 및 전자 상거래 분야에서 여전히 중요하며 생태계는 계속 발전하고 있습니다. 5) Opcache 및 APC를 통해 성능을 최적화하고 OOP 및 설계 패턴을 사용하여 코드 품질을 향상시킵니다.

PHP vs. Python 토론 : 어느 것이 더 낫습니까?PHP vs. Python 토론 : 어느 것이 더 낫습니까?Apr 16, 2025 am 12:03 AM

PHP와 Python에는 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구 사항에 따라 다릅니다. 1) PHP는 웹 개발, 배우기 쉽고 풍부한 커뮤니티 리소스에 적합하지만 구문은 현대적이지 않으며 성능과 보안에주의를 기울여야합니다. 2) Python은 간결한 구문과 배우기 쉬운 데이터 과학 및 기계 학습에 적합하지만 실행 속도 및 메모리 관리에는 병목 현상이 있습니다.

PHP의 목적 : 동적 웹 사이트 구축PHP의 목적 : 동적 웹 사이트 구축Apr 15, 2025 am 12:18 AM

PHP는 동적 웹 사이트를 구축하는 데 사용되며 해당 핵심 기능에는 다음이 포함됩니다. 1. 데이터베이스와 연결하여 동적 컨텐츠를 생성하고 웹 페이지를 실시간으로 생성합니다. 2. 사용자 상호 작용 및 양식 제출을 처리하고 입력을 확인하고 작업에 응답합니다. 3. 개인화 된 경험을 제공하기 위해 세션 및 사용자 인증을 관리합니다. 4. 성능을 최적화하고 모범 사례를 따라 웹 사이트 효율성 및 보안을 개선하십시오.

PHP : 데이터베이스 및 서버 측 로직 처리PHP : 데이터베이스 및 서버 측 로직 처리Apr 15, 2025 am 12:15 AM

PHP는 MySQLI 및 PDO 확장 기능을 사용하여 데이터베이스 작업 및 서버 측 로직 프로세싱에서 상호 작용하고 세션 관리와 같은 기능을 통해 서버 측로 로직을 처리합니다. 1) MySQLI 또는 PDO를 사용하여 데이터베이스에 연결하고 SQL 쿼리를 실행하십시오. 2) 세션 관리 및 기타 기능을 통해 HTTP 요청 및 사용자 상태를 처리합니다. 3) 트랜잭션을 사용하여 데이터베이스 작업의 원자력을 보장하십시오. 4) SQL 주입 방지, 디버깅을 위해 예외 처리 및 폐쇄 연결을 사용하십시오. 5) 인덱싱 및 캐시를 통해 성능을 최적화하고, 읽을 수있는 코드를 작성하고, 오류 처리를 수행하십시오.

PHP에서 SQL 주입을 어떻게 방지합니까? (준비된 진술, pdo)PHP에서 SQL 주입을 어떻게 방지합니까? (준비된 진술, pdo)Apr 15, 2025 am 12:15 AM

PHP에서 전처리 문과 PDO를 사용하면 SQL 주입 공격을 효과적으로 방지 할 수 있습니다. 1) PDO를 사용하여 데이터베이스에 연결하고 오류 모드를 설정하십시오. 2) 준비 방법을 통해 전처리 명세서를 작성하고 자리 표시자를 사용하여 데이터를 전달하고 방법을 실행하십시오. 3) 쿼리 결과를 처리하고 코드의 보안 및 성능을 보장합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.