ホームページ バックエンド開発 PHPチュートリアル ファイルのアップロードとダウンロードのPHP実装例の詳細な説明

ファイルのアップロードとダウンロードのPHP実装例の詳細な説明

Aug 28, 2019 pm 05:29 PM
ファイルのアップロード

1. アップロードの原則と構成

1.1 原則

クライアント ファイルをサーバーにアップロードし、サーバー側のファイル (一時ファイル) を次の場所に移動します。指定されたディレクトリで十分です。

1.2 クライアント構成

必須: フォーム ページ (アップロード ファイルを選択);

具体的に: 送信方法は POST で、enctype を追加します="multipart/form-data" 属性は両方とも必須です (ただし、利点と欠点の両方が共存します。ここでは、後で説明するアップロード メソッドとアップロードされたファイルへのその後の呼び出しなども制限されます

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="doAction.php" method="post" enctype="multipart/form-data">
请选择您要上传的文件:
<input type="file" name="myFile" /><br/>
<input type="submit" value="上传"/>
</form>
<?php

?>
</body>
</html>
ログイン後にコピー

最初はフォーム ページ (フロントエンドの問題は自動的に無視してください...)、キーはフォームの属性です、もう 1 つは入力での type="file" の使用です (強力な機能を反映しています) PHP の拡張など) .

次に doAction.php

<?php
//$_FILES:文件上传变量
//print_r($_FILES);
$filename=$_FILES[&#39;myFile&#39;][&#39;name&#39;];
$type=$_FILES[&#39;myFile&#39;][&#39;type&#39;];
$tmp_name=$_FILES[&#39;myFile&#39;][&#39;tmp_name&#39;];
$size=$_FILES[&#39;myFile&#39;][&#39;size&#39;];
$error=$_FILES[&#39;myFile&#39;][&#39;error&#39;];

//将服务器上的临时文件移动到指定位置
//方法一move_upload_file($tmp_name,$destination)
//move_uploaded_file($tmp_name, "uploads/".$filename);//文件夹应提前建立好,不然报错
//方法二copy($src,$des)
//以上两个函数都是成功返回真,否则返回false
//copy($tmp_name, "copies/".$filename);
//注意,不能两个方法都对临时文件进行操作,临时文件似乎操作完就没了,我们试试反过来
copy($tmp_name, "copies/".$filename);
move_uploaded_file($tmp_name, "uploads/".$filename);
//能够实现,说明move那个函数基本上相当于剪切;copy就是copy,临时文件还在

//另外,错误信息也是不一样的,遇到错误可以查看或者直接报告给用户
if ($error==0) {
    echo "上传成功!";
}else{
    switch ($error){
        case 1:
            echo "超过了上传文件的最大值,请上传2M以下文件";
            break;
        case 2:
            echo "上传文件过多,请一次上传20个及以下文件!";
            break;
        case 3:
            echo "文件并未完全上传,请再次尝试!";
            break;
        case 4:
            echo "未选择上传文件!";
            break;
        case 5:
            echo "上传文件为0";
            break;
    }
}
ログイン後にコピー

まず情報を確認しますprint_r($_FILES)

Array
(
    [myFile] => Array
        (
            [name] => 梁博_简历.doc
            [type] => application/msword
            [tmp_name] => D:\wamp\tmp\php1D78.tmp
            [error] => 0
            [size] => 75776
        )

)
ログイン後にコピー

それでは得られるのは 2 次元配列であること、その使い方などはすべて基本的なことです (実際、私は次元を減らして使用するのが好きです);

は基本的に一目で理解できるものです冗長ではありませんが、重要な点は 2 つあります: tmp_name 一時ファイル名; errorエラー メッセージ (コード名、後で使用できます);

次に、 doAction の最後の部分を見て、エラー メッセージを使用してユーザーにフィードバックします。説明する必要があるのは、エラーが報告される理由です。そして、エラー メッセージは何もありません

1.3 エラー レポートについて

--エラーの理由

基本的に、ファイルをアップロードするためのサーバーの構成要件を超えているか、満たしていません。では、サーバー側の構成は何ですか?

まず、アップロードに何を使用するかを考えますか? POST、upload

したがって、php.ini で次の項目を探します:

file_upload:On

upload_tmp_dir=——一時ファイル保存ディレクトリ;

upload_max_filesize=2M

max_file_uploads=20——最大値一度にアップロードできるファイルの数 (サイズの有無など、上記との違いに注意してください。考慮しないでください)

post_max_size=8M ——ポストモードでのデータ送信の最大値

その他の関連構成

max_exectuion_time=-1——質の悪いプログラムがサーバーを占有することを避けるための最大実行時間リソース;

max_input_time=60

max_input_nesting_level=64——入力ネストの深さ;

memory_limit=128M——単一スレッドの最大独立メモリ使用量

つまり、すべてはリソースの構成に関連しています。

--エラー番号

UPLOAD_ERR_OK 値: 0; エラーは発生せず、ファイルは正常にアップロードされました。
UPLOAD_ERR_INI_SIZE 値: 1; アップロードされたファイルは、php.ini の Upload_max_filesize オプションの制限を超えています。
UPLOAD_ERR_FORM_SIZE 値: 2; アップロードされたファイルのサイズが、HTML フォームの MAX_FILE_SIZE オプションで指定された値を超えています。
UPLOAD_ERR_PARTIAL 値: 3; ファイルの一部のみがアップロードされます。
UPLOAD_ERR_NO_FILE 値: 4; ファイルはアップロードされませんでした。

注: このエラー メッセージは、最初の手順でアップロードされた情報、つまり一時フォルダーにアップロードされた情報であり、移動やコピーの場合ではありません。

2. アップロード関連の制限

2.1 クライアントの制限

<form action="doAction2.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="101321" />
请选择您要上传的文件:
<input type="file" name="myFile" accept="image/jpeg,image/gif,text/html"/><br/>
<input type="submit" value="上传"/>
</form>
ログイン後にコピー

ここでは、入力属性を使用して、アップロードされるファイルのサイズとタイプを制御します。制限はありますが、個人的な感想としては、第一に、HTML コードが「表示される」こと、第二に、動作しないことが多いことです (理由は見つかりませんでしたが、前者のため、私も諦めたいと思っています)

2.2 サーバー側の制限

主にサイズと型を制限し、次にメソッドを制限します。

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
//接受文件,临时文件信息
$fileinfo=$_FILES["myFile"];//降维操作
$filename=$fileinfo["name"];
$tmp_name=$fileinfo["tmp_name"];
$size=$fileinfo["size"];
$error=$fileinfo["error"];
$type=$fileinfo["type"];

//服务器端设定限制
$maxsize=10485760;//10M,10*1024*1024
$allowExt=array(&#39;jpeg&#39;,&#39;jpg&#39;,&#39;png&#39;,&#39;gif&#39;);//允许上传的文件类型(拓展名
$ext=pathinfo($filename,PATHINFO_EXTENSION);//提取上传文件的拓展名

//目的信息
$path="uploads";
if (!file_exists($path)) {   //当目录不存在,就创建目录
    mkdir($path,0777,true);
    chmod($path, 0777);
}
//$destination=$path."/".$filename;
//得到唯一的文件名!防止因为文件名相同而产生覆盖
$uniName=md5(uniqid(microtime(true),true)).$ext;//md5加密,uniqid产生唯一id,microtime做前缀


if ($error==0) {
    if ($size>$maxsize) {
        exit("上传文件过大!");
    }
    if (!in_array($ext, $allowExt)) {
        exit("非法文件类型");
    }
    if (!is_uploaded_file($tmp_name)) {
        exit("上传方式有误,请使用post方式");
    }
    if (@move_uploaded_file($tmp_name, $uniName)) {//@错误抑制符,不让用户看到警告
        echo "文件".$filename."上传成功!";
    }else{
        echo "文件".$filename."上传失败!";
    }
    //判断是否为真实图片(防止伪装成图片的病毒一类的
    if (!getimagesize($tmp_name)) {//getimagesize真实返回数组,否则返回false
        exit("不是真正的图片类型");
    }

}else{
    switch ($error){
        case 1:
            echo "超过了上传文件的最大值,请上传2M以下文件";
            break;
        case 2:
            echo "上传文件过多,请一次上传20个及以下文件!";
            break;
        case 3:
            echo "文件并未完全上传,请再次尝试!";
            break;
        case 4:
            echo "未选择上传文件!";
            break;
        case 7:
            echo "没有临时文件夹";
            break;
    }
}
ログイン後にコピー

2.3 カプセル化

関数

<?php
function uploadFile($fileInfo,$path,$allowExt,$maxSize){

$filename=$fileInfo["name"];
$tmp_name=$fileInfo["tmp_name"];
$size=$fileInfo["size"];
$error=$fileInfo["error"];
$type=$fileInfo["type"];

//服务器端设定限制

$ext=pathinfo($filename,PATHINFO_EXTENSION);

//目的信息
if (!file_exists($path)) {   
    mkdir($path,0777,true);
    chmod($path, 0777);
}
$uniName=md5(uniqid(microtime(true),true)).&#39;.&#39;.$ext;
$destination=$path."/".$uniName;


if ($error==0) {
    if ($size>$maxSize) {
        exit("上传文件过大!");
    }
    if (!in_array($ext, $allowExt)) {
        exit("非法文件类型");
    }
    if (!is_uploaded_file($tmp_name)) {
        exit("上传方式有误,请使用post方式");
    }
    //判断是否为真实图片(防止伪装成图片的病毒一类的
    if (!getimagesize($tmp_name)) {//getimagesize真实返回数组,否则返回false
        exit("不是真正的图片类型");
    }
    if (@move_uploaded_file($tmp_name, $destination)) {//@错误抑制符,不让用户看到警告
        echo "文件".$filename."上传成功!";
    }else{
        echo "文件".$filename."上传失败!";
    }
    

}else{
    switch ($error){
        case 1:
            echo "超过了上传文件的最大值,请上传2M以下文件";
            break;
        case 2:
            echo "上传文件过多,请一次上传20个及以下文件!";
            break;
        case 3:
            echo "文件并未完全上传,请再次尝试!";
            break;
        case 4:
            echo "未选择上传文件!";
            break;
        case 7:
            echo "没有临时文件夹";
            break;
    }
}
return $destination;
}
ログイン後にコピー

Call

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
$fileInfo=$_FILES["myFile"];
$maxSize=10485760;//10M,10*1024*1024
$allowExt=array(&#39;jpeg&#39;,&#39;jpg&#39;,&#39;png&#39;,&#39;tif&#39;);
$path="uploads";
include_once &#39;upFunc.php&#39;;
uploadFile($fileInfo, $path, $allowExt, $maxSize);
ログイン後にコピー

3. 複数のファイルのアップロードの実装

3.1 単一ファイルのカプセル化を使用する

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="doAction5.php" method="post" enctype="multipart/form-data">
请选择您要上传的文件:<input type="file" name="myFile1" /><br/>
请选择您要上传的文件:<input type="file" name="myFile2" /><br/>
请选择您要上传的文件:<input type="file" name="myFile3" /><br/>
请选择您要上传的文件:<input type="file" name="myFile4" /><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
ログイン後にコピー
<?php
//print_r($_FILES);
header(&#39;content-type:text/html;charset=utf-8&#39;);
include_once &#39;upFunc.php&#39;;
foreach ($_FILES as $fileInfo){
    $file[]=uploadFile($fileInfo);
}
ログイン後にコピー

ここでのアイデアは次のとおりです。 from print_r($_FILES) これを見つけて印刷すると、それが 2 次元配列であることがわかります。非常に簡単です。ただトラバースして使用するだけです!

Change上記の関数の定義といくつかのデフォルト値を指定します。

function uploadFile($fileInfo,$path="uploads",$allowExt=array(&#39;jpeg&#39;,&#39;jpg&#39;,&#39;png&#39;,&#39;tif&#39;),$maxSize=10485760){
ログイン後にコピー

このように、Simple はシンプルですが、いくつか問題があります。

通常、4 枚の写真をアップロードするのは問題ありませんが、

3.2 カプセル化のバージョンアップ

カプセル化の実装を目指しています。複数または単一のファイルのアップロード

最初に次のような静的ファイルを作成します

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="doAction5.php" method="post" enctype="multipart/form-data">
请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>
请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>
请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>
请选择您要上传的文件:<input type="file" name="myFile[]" /><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
ログイン後にコピー

Print $_FILES

Array
(
    [myFile] => Array
        (
            [name] => Array
                (
                    [0] => test32.png
                    [1] => test32.png
                    [2] => 333.png
                    [3] => test41.png
                )

            [type] => Array
                (
                    [0] => image/png
                    [1] => image/png
                    [2] => image/png
                    [3] => image/png
                )

            [tmp_name] => Array
                (
                    [0] => D:\wamp\tmp\php831C.tmp
                    [1] => D:\wamp\tmp\php834C.tmp
                    [2] => D:\wamp\tmp\php837C.tmp
                    [3] => D:\wamp\tmp\php83BB.tmp
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                )

            [size] => Array
                (
                    [0] => 46174
                    [1] => 46174
                    [2] => 34196
                    [3] => 38514
                )

        )

)
ログイン後にコピー

.# をクリックすると、3 次元配列を取得できます。

##複雑ですが、通常の方法では複雑です。値がすべてまとめられているため、値を取得するのに非常に便利です! !

したがって、最初にファイル情報を取得し、処理情報を 1 つのファイルに変換します

#

function getFiles(){
    $i=0;
    foreach($_FILES as $file){
        if(is_string($file[&#39;name&#39;])){  //单文件判定
            $files[$i]=$file;
            $i++;
        }elseif(is_array($file[&#39;name&#39;])){
            foreach($file[&#39;name&#39;] as $key=>$val){  //我的天,这个$key用的diao
                $files[$i][&#39;name&#39;]=$file[&#39;name&#39;][$key];
                $files[$i][&#39;type&#39;]=$file[&#39;type&#39;][$key];
                $files[$i][&#39;tmp_name&#39;]=$file[&#39;tmp_name&#39;][$key];
                $files[$i][&#39;error&#39;]=$file[&#39;error&#39;][$key];
                $files[$i][&#39;size&#39;]=$file[&#39;size&#39;][$key];
                $i++;
            }
        }
    }
    return $files;
    
}
ログイン後にコピー

その後、前と同じように終了エラーが発生した場合は、終了を変更するだけです。ここでは res## を使用します。

#

function uploadFile($fileInfo,$path=&#39;./uploads&#39;,$flag=true,$maxSize=1048576,$allowExt=array(&#39;jpeg&#39;,&#39;jpg&#39;,&#39;png&#39;,&#39;gif&#39;)){
    //$flag=true;
    //$allowExt=array(&#39;jpeg&#39;,&#39;jpg&#39;,&#39;gif&#39;,&#39;png&#39;);
    //$maxSize=1048576;//1M
    //判断错误号
    $res=array();
    if($fileInfo[&#39;error&#39;]===UPLOAD_ERR_OK){
        //检测上传得到小
        if($fileInfo[&#39;size&#39;]>$maxSize){
            $res[&#39;mes&#39;]=$fileInfo[&#39;name&#39;].&#39;上传文件过大&#39;;
        }
        $ext=getExt($fileInfo[&#39;name&#39;]);
        //检测上传文件的文件类型
        if(!in_array($ext,$allowExt)){
            $res[&#39;mes&#39;]=$fileInfo[&#39;name&#39;].&#39;非法文件类型&#39;;
        }
        //检测是否是真实的图片类型
        if($flag){
            if(!getimagesize($fileInfo[&#39;tmp_name&#39;])){
                $res[&#39;mes&#39;]=$fileInfo[&#39;name&#39;].&#39;不是真实图片类型&#39;;
            }
        }
        //检测文件是否是通过HTTP POST上传上来的
        if(!is_uploaded_file($fileInfo[&#39;tmp_name&#39;])){
            $res[&#39;mes&#39;]=$fileInfo[&#39;name&#39;].&#39;文件不是通过HTTP POST方式上传上来的&#39;;
        }
        if($res) return $res;
        //$path=&#39;./uploads&#39;;
        if(!file_exists($path)){
            mkdir($path,0777,true);
            chmod($path,0777);
        }
        $uniName=getUniName();
        $destination=$path.&#39;/&#39;.$uniName.&#39;.&#39;.$ext;
        if(!move_uploaded_file($fileInfo[&#39;tmp_name&#39;],$destination)){
            $res[&#39;mes&#39;]=$fileInfo[&#39;name&#39;].&#39;文件移动失败&#39;;
        }
        $res[&#39;mes&#39;]=$fileInfo[&#39;name&#39;].&#39;上传成功&#39;;
        $res[&#39;dest&#39;]=$destination;
        return $res;
        
    }else{
        //匹配错误信息
        switch ($fileInfo [&#39;error&#39;]) {
            case 1 :
                $res[&#39;mes&#39;] = &#39;上传文件超过了PHP配置文件中upload_max_filesize选项的值&#39;;
                break;
            case 2 :
                $res[&#39;mes&#39;] = &#39;超过了表单MAX_FILE_SIZE限制的大小&#39;;
                break;
            case 3 :
                $res[&#39;mes&#39;] = &#39;文件部分被上传&#39;;
                break;
            case 4 :
                $res[&#39;mes&#39;] = &#39;没有选择上传文件&#39;;
                break;
            case 6 :
                $res[&#39;mes&#39;] = &#39;没有找到临时目录&#39;;
                break;
            case 7 :
            case 8 :
                $res[&#39;mes&#39;] = &#39;系统错误&#39;;
                break;
        }
        return $res;
    }
}
ログイン後にコピー

2 つの小さなものをカプセル化します

function getExt($filename){
    return strtolower(pathinfo($filename,PATHINFO_EXTENSION));
}

/**
 * 产生唯一字符串
 * @return string
 */
function getUniName(){
    return md5(uniqid(microtime(true),true));
}
ログイン後にコピー

次に、static で multiple 属性を使用して複数のファイルの入力を実現します

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="doAction6.php" method="POST" enctype="multipart/form-data">
请选择您要上传的文件:<input type="file" name="myFile[]" multiple=&#39;multiple&#39; /><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
ログイン後にコピー

doAction6.php

<?php 
//print_r($_FILES);
header("content-type:text/html;charset=utf-8");
require_once &#39;upFunc2.php&#39;;
require_once &#39;common.func.php&#39;;
$files=getFiles();
// print_r($files);
foreach($files as $fileInfo){
    $res=uploadFile($fileInfo);
    echo $res[&#39;mes&#39;],&#39;<br/>&#39;;
    $uploadFiles[]=@$res[&#39;dest&#39;];
}
$uploadFiles=array_values(array_filter($uploadFiles));
//print_r($uploadFiles);
ログイン後にコピー

4. オブジェクト指向ファイルのアップロード

<?php 
class upload{
    protected $fileName;
    protected $maxSize;
    protected $allowMime;
    protected $allowExt;
    protected $uploadPath;
    protected $imgFlag;
    protected $fileInfo;
    protected $error;
    protected $ext;
    /**
     * @param string $fileName
     * @param string $uploadPath
     * @param string $imgFlag
     * @param number $maxSize
     * @param array $allowExt
     * @param array $allowMime
     */
    public function __construct($fileName=&#39;myFile&#39;,$uploadPath=&#39;./uploads&#39;,$imgFlag=true,$maxSize=5242880,$allowExt=array(&#39;jpeg&#39;,&#39;jpg&#39;,&#39;png&#39;,&#39;gif&#39;),$allowMime=array(&#39;image/jpeg&#39;,&#39;image/png&#39;,&#39;image/gif&#39;)){
        $this->fileName=$fileName;
        $this->maxSize=$maxSize;
        $this->allowMime=$allowMime;
        $this->allowExt=$allowExt;
        $this->uploadPath=$uploadPath;
        $this->imgFlag=$imgFlag;
        $this->fileInfo=$_FILES[$this->fileName];
    }
    /**
     * 检测上传文件是否出错
     * @return boolean
     */
    protected function checkError(){
        if(!is_null($this->fileInfo)){
            if($this->fileInfo[&#39;error&#39;]>0){
                switch($this->fileInfo[&#39;error&#39;]){
                    case 1:
                        $this->error=&#39;超过了PHP配置文件中upload_max_filesize选项的值&#39;;
                        break;
                    case 2:
                        $this->error=&#39;超过了表单中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;
                    case 8:
                        $this->error=&#39;由于PHP的扩展程序中断文件上传&#39;;
                        break;
                        
                }
                return false;
            }else{
                return true;
            }
        }else{
            $this->error=&#39;文件上传出错&#39;;
            return false;
        }
    }
    /**
     * 检测上传文件的大小
     * @return boolean
     */
    protected function checkSize(){
        if($this->fileInfo[&#39;size&#39;]>$this->maxSize){
            $this->error=&#39;上传文件过大&#39;;
            return false;
        }
        return true;
    }
    /**
     * 检测扩展名
     * @return boolean
     */
    protected function checkExt(){
        $this->ext=strtolower(pathinfo($this->fileInfo[&#39;name&#39;],PATHINFO_EXTENSION));
        if(!in_array($this->ext,$this->allowExt)){
            $this->error=&#39;不允许的扩展名&#39;;
            return false;
        }
        return true;
    }
    /**
     * 检测文件的类型
     * @return boolean
     */
    protected function checkMime(){
        if(!in_array($this->fileInfo[&#39;type&#39;],$this->allowMime)){
            $this->error=&#39;不允许的文件类型&#39;;
            return false;
        }
        return true;
    }
    /**
     * 检测是否是真实图片
     * @return boolean
     */
    protected function checkTrueImg(){
        if($this->imgFlag){
            if(!@getimagesize($this->fileInfo[&#39;tmp_name&#39;])){
                $this->error=&#39;不是真实图片&#39;;
                return false;
            }
            return true;
        }
    }
    /**
     * 检测是否通过HTTP POST方式上传上来的
     * @return boolean
     */
    protected function checkHTTPPost(){
        if(!is_uploaded_file($this->fileInfo[&#39;tmp_name&#39;])){
            $this->error=&#39;文件不是通过HTTP POST方式上传上来的&#39;;
            return false;
        }
        return true;
    }
    /**
     *显示错误 
     */
    protected function showError(){
        exit(&#39;<span style="color:red">&#39;.$this->error.&#39;</span>&#39;);
    }
    /**
     * 检测目录不存在则创建
     */
    protected function checkUploadPath(){
        if(!file_exists($this->uploadPath)){
            mkdir($this->uploadPath,0777,true);
        }
    }
    /**
     * 产生唯一字符串
     * @return string
     */
    protected function getUniName(){
        return md5(uniqid(microtime(true),true));
    }
    /**
     * 上传文件
     * @return string
     */
    public function uploadFile(){
        if($this->checkError()&&$this->checkSize()&&$this->checkExt()&&$this->checkMime()&&$this->checkTrueImg()&&$this->checkHTTPPost()){
            $this->checkUploadPath();
            $this->uniName=$this->getUniName();
            $this->destination=$this->uploadPath.&#39;/&#39;.$this->uniName.&#39;.&#39;.$this->ext;
            if(@move_uploaded_file($this->fileInfo[&#39;tmp_name&#39;], $this->destination)){
                return  $this->destination;
            }else{
                $this->error=&#39;文件移动失败&#39;;
                $this->showError();
            }
        }else{
            $this->showError();
        }
    }
}
ログイン後にコピー
<?php 
header(&#39;content-type:text/html;charset=utf-8&#39;);
require_once &#39;upload.class.php&#39;;
$upload=new upload(&#39;myFile1&#39;,&#39;imooc&#39;);
$dest=$upload->uploadFile();
echo $dest;
ログイン後にコピー

5. ダウンロード

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
<a href="1.rar">下载1.rar</a>
<br />
<a href="1.jpg">下载1.jpg</a>
<br />
<a href="doDownload.php?filename=1.jpg">通过程序下载1.jpg</a>
<br />
<a href="doDownload.php?filename=../upload/nv.jpg">下载nv.jpg</a>
<?php

?>
</body>
</html>
ログイン後にコピー
<?php 
$filename=$_GET[&#39;filename&#39;];
header(&#39;content-disposition:attachment;
filename=&#39;.basename($filename));
header(&#39;content-length:&#39;.filesize($filename));
readfile($filename);
ログイン後にコピー

总结:

<form action="doAction.php" method="post" enctype="multipart/form-data">

<input type="file" name="myFile" /><br/>

 二维数组的降维处理;

$_FILES变量

move_upload_file();copy();

tmp_name临时文件;

拓展名的提取;

真实图片的验证;

唯一文件名的生成;

函数封装以及调用;

利用单个文件函数实现多文件上传;

小功能的封装;

多文件的遍历;

面向对象的开发过程;

下载;

以上就是全部的讲解,希望可以帮助到大家,有错误的地方请指出。

更多相关问题请访问PHP中文网:PHP视频教程

以上がファイルのアップロードとダウンロードのPHP実装例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Workerman ドキュメントにファイルのアップロードとダウンロードを実装する Workerman ドキュメントにファイルのアップロードとダウンロードを実装する Nov 08, 2023 pm 06:02 PM

Workerman ドキュメントでファイルのアップロードとダウンロードを実装するには、特定のコード サンプルが必要です はじめに: Workerman は、シンプル、効率的、使いやすい高性能 PHP 非同期ネットワーク通信フレームワークです。実際の開発では、ファイルのアップロードとダウンロードが一般的な機能要件となりますが、この記事では、Workerman フレームワークを使用してファイルのアップロードとダウンロードを実装する方法と、具体的なコード例を紹介します。 1. ファイル アップロード: ファイル アップロードとは、ローカル コンピューター上のファイルをサーバーに転送する操作を指します。以下が使用されます

Laravelを使用してファイルのアップロードおよびダウンロード機能を実装する方法 Laravelを使用してファイルのアップロードおよびダウンロード機能を実装する方法 Nov 02, 2023 pm 04:36 PM

Laravel を使用してファイルのアップロードおよびダウンロード機能を実装する方法 Laravel は、Web アプリケーションの開発をより簡単かつ効率的にするための豊富な機能とツールを提供する人気のある PHP Web フレームワークです。よく使用される機能の 1 つは、ファイルのアップロードとダウンロードです。この記事では、Laravelを使用してファイルのアップロードおよびダウンロード機能を実装する方法と、具体的なコード例を紹介します。ファイルのアップロード ファイルのアップロードとは、ローカル ファイルを保存するためにサーバーにアップロードすることを指します。 Laravelではファイルアップロードを使用できます

gRPC を使用して Golang でファイルのアップロードを実装するにはどうすればよいですか? gRPC を使用して Golang でファイルのアップロードを実装するにはどうすればよいですか? Jun 03, 2024 pm 04:54 PM

gRPC を使用してファイルのアップロードを実装するにはどうすればよいですか?リクエストおよびレスポンスメッセージを含むサポートサービス定義を作成します。クライアントでは、アップロードされるファイルが開かれてチャンクに分割され、gRPC ストリーム経由でサーバーにストリーミングされます。サーバー側では、ファイル チャンクが受信され、ファイルに保存されます。ファイルのアップロードが完了すると、サーバーはアップロードが成功したかどうかを示す応答を送信します。

Javaファイルアップロード例外(FileUploadException)の解決方法 Javaファイルアップロード例外(FileUploadException)の解決方法 Aug 18, 2023 pm 12:11 PM

Java ファイルアップロード例外 (FileUploadException) を解決する方法 Web 開発でよく遭遇する問題の 1 つは、FileUploadException (ファイル アップロード例外) です。この問題は、ファイル サイズが制限を超えている、ファイル形式が一致していない、サーバー構成が正しくないなど、さまざまな理由で発生する可能性があります。この記事では、これらの問題を解決するいくつかの方法について説明し、対応するコード例を示します。アップロードされるファイルのサイズを制限する ほとんどのシナリオでは、ファイル サイズを制限します

PHPを使用してFTPファイルアップロードの進行状況バーを実装する方法 PHPを使用してFTPファイルアップロードの進行状況バーを実装する方法 Jul 30, 2023 pm 06:51 PM

PHP を使用して FTP ファイル アップロード プログレス バーを実装する方法 1. 背景の紹介 Web サイト開発では、ファイル アップロードは一般的な機能です。大きなファイルのアップロードでは、ユーザー エクスペリエンスを向上させるために、多くの場合、ファイルのアップロード プロセスをユーザーに知らせるために、アップロードの進行状況バーを表示する必要があります。この記事では、PHPを使用してFTPファイルアップロードのプログレスバー機能を実装する方法を紹介します。 2. FTP ファイルアップロードのプログレスバー実装の基本的な考え方. FTP ファイルアップロードのプログレスバーは通常、アップロードされたファイルのサイズとアップロードされたファイルのサイズを計算することによって計算されます。

Laravel でのファイルのアップロードと処理: ユーザーがアップロードしたファイルの管理 Laravel でのファイルのアップロードと処理: ユーザーがアップロードしたファイルの管理 Aug 13, 2023 pm 06:45 PM

Laravel でのファイルのアップロードと処理: ユーザーがアップロードしたファイルの管理 はじめに: ファイルのアップロードは、最新の Web アプリケーションにおける非常に一般的な機能要件です。 Laravel フレームワークでは、ファイルのアップロードと処理が非常にシンプルかつ効率的になります。この記事では、ファイルアップロードの検証、保存、処理、表示など、Laravelでユーザーがアップロードしたファイルを管理する方法を紹介します。 1. ファイルのアップロード ファイルのアップロードとは、クライアントからサーバーにファイルをアップロードすることを指します。 Laravel では、ファイルのアップロードは非常に簡単に処理できます。初め、

PHP ファイル アップロード ガイド: move_uploaded_file 関数を使用してアップロードされたファイルを処理する方法 PHP ファイル アップロード ガイド: move_uploaded_file 関数を使用してアップロードされたファイルを処理する方法 Jul 30, 2023 pm 02:03 PM

PHP ファイル アップロード ガイド: move_uploaded_file 関数を使用してアップロードされたファイルを処理する方法 Web アプリケーションの開発では、ファイルのアップロードが一般的な要件です。 PHP には、アップロードされたファイルを処理するための便利な関数 move_uploaded_file() が用意されています。この記事では、この機能を使ってファイルアップロード機能を実装する方法を紹介します。 1. 準備 開始する前に、PHP 環境がファイルアップロードパラメータで設定されていることを確認してください。これを行うには、php.in を開いてください。

Golang関数でファイルアップロード処理を簡素化 Golang関数でファイルアップロード処理を簡素化 May 02, 2024 pm 06:45 PM

回答: はい、Golang はファイルのアップロード処理を簡素化する機能を提供します。詳細: MultipartFile タイプは、ファイルのメタデータとコンテンツへのアクセスを提供します。 FormFile 関数は、フォーム要求から特定のファイルを取得します。 ParseForm 関数と ParseMultipartForm 関数は、フォーム データとマルチパート フォーム データを解析するために使用されます。これらの機能を使用すると、ファイル処理プロセスが簡素化され、開発者はビジネス ロジックに集中できるようになります。

See all articles