Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Datei hochladen, mehrere Dateien hochladen

PHP-Datei hochladen, mehrere Dateien hochladen

WBOY
WBOYOriginal
2016-08-08 09:20:07896Durchsuche

Bevor ich Unsinn rede, möchte ich zunächst sagen, dass dieser Artikel auf der Beherrschung des PHP-Uploads einzelner Dateien basiert, sodass ich hier nicht auf Details zur Datei-Upload-Serverkonfiguration und den Formulareinstellungen eingehen werde.

Da gibt es nicht viel zu sagen, kommen wir gleich zur Sache. Es gibt zwei Möglichkeiten, eine Anfrageseite zu schreiben (es wird nur der Formularteil vorgestellt, am Beispiel des Hochladens von drei Dateien).

<span><</span><span>form </span><span>action</span><span>="doAction.php"</span><span> method</span><span>="post"</span><span> enctype</span><span>="multipart/form-data"</span><span>></span><span>        请选择我的上传文件
        </span><span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="myfile[]"</span><span>/></span><span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="myfile[]"</span><span>/></span><span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="myfile[]"</span><span>/></span><span><</span><span>input </span><span>type</span><span>="submit"</span><span> value</span><span>="上传"</span><span>/></span><span></</span><span>form</span><span>></span>

<span><</span><span>form </span><span>action</span><span>="doAction.php"</span><span> method</span><span>="post"</span><span> enctype</span><span>="multipart/form-data"</span><span>></span><span>        请选择我的上传文件
        </span><span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="myfil1"</span><span>/></span><span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="myfil2"</span><span>/></span><span><</span><span>input </span><span>type</span><span>="file"</span><span> name</span><span>="myfil3"</span><span>/></span><span><</span><span>input </span><span>type</span><span>="submit"</span><span> value</span><span>="上传"</span><span>/></span><span></</span><span>form</span><span>></span>

Beim Vergleich der beiden wird festgestellt, dass der einzige Unterschied der Name ist. Der erste legt den Namen in Form eines Arrays fest, während der zweite den Namen festlegt ist eine Methode, die wir uns beim Einrichten leicht vorstellen können.

Obwohl oberflächlich nur ein kleiner Unterschied angezeigt wird, sind die tatsächlich an die doAction.php-Seite übermittelten $_FILES sehr unterschiedlich.

Der erste Typ von $_FILES ist ein dreidimensionales Array, während der zweite Typ ein zweidimensionales Array ist, wie folgt:

Natürlich beschäftigen wir uns mit dem ersten. Die beiden Formate von $_FILES sind bequemer. Natürlich können wir auch einen Weg finden, $_FILES im ersten Format in die zweite Form umzuwandeln, wie folgt:

<span>function</span><span> getFiles(){


    </span><span>foreach</span>(<span>$_FILES</span><span>as</span><span>$file</span><span>){
        </span><span>$fileNum</span>=<span>count</span>(<span>$file</span>['name'<span>]);
        </span><span>if</span> (<span>$fileNum</span>==1<span>) {

            </span><span>$files</span>=<span>$file</span><span>;
        }</span><span>else</span><span>{
            
            </span><span>for</span> (<span>$i</span>=0; <span>$i</span> < <span>$fileNum</span>; <span>$i</span>++<span>) { 
                </span><span>$files</span>[<span>$i</span>]['name']=<span>$file</span>['name'][<span>$i</span><span>];
                </span><span>$files</span>[<span>$i</span>]['type']=<span>$file</span>['type'][<span>$i</span><span>];
                </span><span>$files</span>[<span>$i</span>]['tmp_name']=<span>$file</span>['tmp_name'][<span>$i</span><span>];
                </span><span>$files</span>[<span>$i</span>]['error']=<span>$file</span>['error'][<span>$i</span><span>];
                </span><span>$files</span>[<span>$i</span>]['size']=<span>$file</span>['size'][<span>$i</span><span>];
            }
        }

        
    }
    </span><span>return</span><span>$files</span><span>;
}</span>

Durch diese Funktion wird $_FILES in das umgewandelt Folgendes Format:

In diesem Moment befinden sich die beiden Upload-Methoden in derselben Startzeile. Die nächste Aufgabe besteht darin, die Funktion uploadFile() zu schreiben, um jede Datei hochzuladen steht auch im Mittelpunkt dieses Artikels.

Funktion zum Hochladen von Dateien:

<span>function</span> uploadFile(<span>$file</span>,<span>$path</span>='./uploads',<span>$max_size</span>,<span>$allowExt</span><span>){
  </span><span>$filename</span>=<span>$file</span>['name'<span>];
    </span><span>$type</span>=<span>$file</span>['type'<span>];
    </span><span>$temp_name</span>=<span>$file</span>['tmp_name'<span>];
    </span><span>$error</span>=<span>$file</span>['error'<span>];
    </span><span>$size</span>=<span>$file</span>['size'<span>];


    </span><span>if</span> (<span>$error</span>==<span>UPLOAD_ERR_OK) {
        </span><span>if</span> (<span>$size</span>><span>$max_size</span><span>) {
            </span><span>$res</span>['mes']=<span>$filename</span>."文件超过规定上传大小"<span>;
        }
        </span><span>$ext</span>=getExt(<span>$filename</span><span>);
        </span><span>if</span> (!<span>in_array</span>(<span>$ext</span>, <span>$allowExt</span><span>)) {
            </span><span>$res</span>['mes']=<span>$filename</span>.'文件名不合乎规范'<span>;
        }
        </span><span>if</span> (!<span>is_uploaded_file</span>(<span>$temp_name</span><span>)) {
            </span><span>$res</span>['mes']=<span>$filename</span>."文件不是通过HTTP POST 方法上传上传过来的"<span>;
        }


        </span><span>if</span> (@<span>$res</span><span>) {
            </span><span>return</span><span>$res</span><span>;
        }


        </span><span>if</span> (!<span>file_exists</span>(<span>$path</span><span>)) {
            </span><span>mkdir</span>(<span>$path</span>,0777,<span>true</span><span>);
      </span><span>chmod</span>(<span>$path</span>, 0777<span>);
        }
        </span><span>$fname</span>=<span>getUniName();


        </span><span>$destination</span>=<span>$path</span>.'/'.<span>$fname</span>.'.'.<span>$ext</span><span>;
        </span><span>if</span> (<span>move_uploaded_file</span>(<span>$temp_name</span>, <span>$destination</span><span>)) {
            </span><span>$res</span>['mes']=<span>$filename</span>.'上传成功'<span>;
            </span><span>$res</span>['dest']=<span>$destination</span><span>;
        }</span><span>else</span><span>{
            </span><span>$res</span>['mes']=<span>$filename</span>."文件上传失败"<span>;
        }
    }</span><span>else</span><span>{
        </span><span>switch</span> (<span>$error</span><span>) {
            </span><span>case</span> '1':
            <span>$res</span>['mes']="超过了配置文件上传文件的大小"<span>;
            </span><span>break</span><span>;
            </span><span>case</span> '2':
            <span>$res</span>['mes']="超过表单设置上传文件文件的大小"<span>;
            </span><span>break</span><span>;
            </span><span>case</span> '3':
            <span>$res</span>['mes']="文件部分被上传"<span>;
            </span><span>break</span><span>;
            </span><span>case</span> '4':
            <span>$res</span>['mes']="没有文件被上传"<span>;

            </span><span>break</span><span>;
            </span><span>case</span> '6':
            <span>$res</span>['mes']="没有找到临时目录"<span>;
            </span><span>break</span><span>;
            </span><span>case</span> '7':
            <span>$res</span>['mes']="文件不可写"<span>;

            </span><span>break</span><span>;
            </span><span>default</span>:
            <span>$res</span>['mes']="上传文件失败"<span>;
            </span><span>break</span><span>;
        }
    }

    </span><span>return</span><span>$res</span><span>;

}</span>

Dazu gehören auch zwei kleine Funktionen:

<span>/*</span><span>*
 * 获得文件扩展名
 * @param  string $filename 上传文件名
 * @return string           返回扩展名
 </span><span>*/</span><span>function</span> getExt(<span>$filename</span><span>){
    </span><span>$arr</span>=<span>explode</span>('.', <span>basename</span>(<span>$filename</span><span>));

    </span><span>return</span><span>end</span>(<span>$arr</span><span>);
}
</span><span>/*</span><span>*
 * 获得文件唯一扩展名
 * @return string 经过md5后生成32位唯一的上传文件名
 </span><span>*/</span><span>function</span><span> getUniName(){

    </span><span>return</span><span>md5</span>(<span>uniqid</span>(<span>microtime</span>(<span>true</span>),<span>true</span><span>)); 
}</span>

Gefühl:

Ich kam vor langer Zeit mit dem Hochladen von PHP-Dateien in Berührung und es fühlte sich damals wie ein Chaos an. Nun sieht es so aus, als ob Sie die in $_FILES enthaltenen Informationen verstehen und das von Ihnen geschriebene Wissen verwenden, um einige Tipps zu verarbeiten. Das System wird dies logisch berücksichtigen und die Funktionen rechtzeitig kapseln. Anschließend kann der Datei-Upload durchgeführt werden schnell raus. Der Code, den ich dieses Mal zeige, wird definitiv keine Anforderungen erfüllen, sodass er entsprechend geändert werden kann, um Ihr eigener Code zu werden. Wenn es sich bei der hochgeladenen Datei beispielsweise um ein Bild handelt, kann dies nicht allein anhand der Erweiterung beurteilt werden. Sie muss auch anhand der Eigenschaften des Bildes überprüft werden.

Das Obige stellt das Hochladen von PHP-Dateien und das Hochladen mehrerer Dateien vor, einschließlich Aspekten des Inhalts. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Hinweise zu PHPNächster Artikel:Hinweise zu PHP