php 多文件上传的处理方法
php教程 多文件上传的处理方法
关于多文件上传我们讲过很多了,下面是一个简单的普通form多文件上传类了,需要的朋友可以下载试用一下。
<?php
class upload {
public $up_ext=array(), $up_max=5210, $up_dir;
private $up_name, $up_rename=true, $up_num=0, $up_files=array(), $up_ret=array();
function __construct($name, $ext=array(), $rename=true) {
if (!empty($name)) {
$this->up_name = $name;
!empty($ext) && $this->up_ext = $ext;
$this->up_rename = $rename;
$this->up_dir = website_dirroot.
$globals['cfg_upload_path'];
$this->initupload();
} else {
exit('upload文件域名称为空,初始化失败!');
}
}
private function initupload() {
if (is_array($_files[$this->up_name])) {
$up_arr = count($_files[$this->up_name]);
$up_all = count($_files[$this->up_name], 1);
$up_cnt = ($up_all - $up_arr) / $up_arr;
for ($i = 0; $i < $up_cnt; $i ++) {
if ($_files[$this->up_name]['error'][$i] != 4) {
$this->up_files[] = array(
'tmp_name' => $_files[$this->up_name]['tmp_name'][$i],
'name' => $_files[$this->up_name]['name'][$i],
'type' => $_files[$this->up_name]['type'][$i],
'size' => $_files[$this->up_name]['size'][$i],
'error' => $_files[$this->up_name]['error'][$i]
);
}
}
$this->up_num = count($this->up_files);
} else {
if (isset($_files[$this->up_name])) {
$this->up_files = array(
'tmp_name' => $_files[$this->up_name]['tmp_name'],
'name' => $_files[$this->up_name]['name'],
'type' => $_files[$this->up_name]['type'],
'size' => $_files[$this->up_name]['size'],
'error' => $_files[$this->up_name]['error']
);
$this->up_num = 1;
} else {
exit('没找找到需要upload的文件!');
}
}
$this->chkupload();
}
private function chkupload() {
if (empty($this->up_ext)) {
$up_mime = array('image/wbmp', 'image/bmp', 'image/gif', 'image/pjpeg', 'image/x-png');
foreach ($this->up_files as $up_file) {
$up_allw = false;
foreach ($up_mime as $mime) {
if ($up_file['type'] == $mime) {
$up_allw = true; break;
}
}
!$up_allw && exit('不允许上传'.$up_file['type'].'格式的文件!');
if ($up_file['size'] / 1024 > $this->up_max) {
exit('不允许上传大于 '.$this->up_max.'k 的文件!');
}
}
} else {
foreach ($this->up_files as $up_file) {
$up_ext = end(explode('.', $up_file['name']));
$up_allw = false;
foreach ($this->up_ext as $ext) {
if ($up_ext == $ext) {
$up_allw = true; break;
}
}
!$up_allw && exit('不允许上传.'.$up_ext.'格式的文件!');
if ($up_file['size'] / 1024 > $this->up_max) {
exit('不允许上传大于 '.$this->up_max.'k 的文件!');
}
}
}
$this->uploading();
}
private function uploading() {
if (io::dircreate($this->up_dir)) {
if (chmod($this->up_dir, 0777)) {
if (!empty($this->up_files)) {
foreach ($this->up_files as $up_file) {
if (is_uploaded_file($up_file['tmp_name'])) {
$file_name = $up_file['name'];
if ($this->up_rename) {
$file_ext = end(explode('.', $file_name));
$file_rnd = substr(md5(uniqid()), mt_rand(0, 26), 6);
$file_name = date('ymdhis').'_'.$file_rnd.'.'.$file_ext;
}
$file_name = $this->up_dir.'/'.$file_name;
if (move_uploaded_file($up_file['tmp_name'], $file_name)) {
$this->up_ret[] = str_replace(website_dirroot, '', $file_name);
} else {
exit('文件上传失败!');
}
}
}
}
} else {
exit('未开启写入权限!');
}
} else {
exit('上传目录创建失败!');
}
}
public function getupload() {
return empty($this->up_ret) ? false : $this->up_ret;
}
function __destruct() {}
}
?>
于大量文件或大体积文件的情况可以考虑调用组件解决(如前文提到的swfupload组件)。然而有些情况只需要传递几个文件,而且文件体积并不太大,这种情况下使用组件则有点牛刀杀鸡的感觉,通过html自带的<input type="file">表单就可以实现需要的功能,关键在于后台接收程序的处理。
php处理上传做的很方便,上传文件的信息通过服务器自动处理到$_files数组中,开发者只需要使用的内置处理函数简单操作就可以啦。asp教程开发者则没有这么幸运,官方并没有提供直接的处理方法,需要开发者自己设计,这时就需要开发者了解iis对enctype="multipart/form-data"表单的处理方式,iis把enctype="multipart/form-data"表单提交的数据存储成二进制数据,以二进制格式返回给开发者,开发者则需要通过lenb、midb的字节处理函数来分析获取的上传内容,客户端发送的具体表单数据格式,可以了解下http rfc1867协议传输格式方面的知识。
//如何提取远程图片url地址中的相对地址,并创建文件夹
$imgurl = "http://www.111cn.net /images/l/201011/sjfzgm1289209745159.jpg" ;
//去掉"http:/"
$imgurl2 = substr($imgurl,6);
$imgurl3 = strstr($imgurl2,'/'); //这就变成了:$imgurl3 == "/images/l/201011/sjfzgm1289209745159.jpg ";
//接下来翻转字符串
$imgurl4 = strrev($imgurl3); //这就变成了:$imgurl4 == "/gpj.9515479029821mgzfjs/110102/l/segami/";
//去掉"/"
$imgurl4 = substr($imgurl3,1); //这就变成了:$imgurl4 == "gpj.9515479029821mgzfjs/110102/l/segami/";
//去掉文件名
$imgurl5 = strstr($imgurl4,'/'); //这就变成了:$imgurl4 == "/110102/l/segami/";
//再翻转,还原
$imgurl6 = strrev($imgurl5); //这就变成了:$imgurl6 == "/images/l/201011/";
/*
通常是 <img src=" ">这样匹配的
也有 url("")
接着获得相对地址 ,先判断 域名 这个去找
../
./
/
这么三种是目录的表现
图片的扩展名就那么几个
应该写出来就能用的吧
*/
//用正则提取标签里的内容
$str = '<p>文字</p>
<span>文字2
</span>';
$preg = '/<.+?>(.+?)</.+?>/is';
preg_match_all($preg, $str, $result);
print_r($result[1]);
php教程面向接口编程 耦合设计模式
关于接口的理解。 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。 我们在一般实现一个系统的时候,通常是将定义与实现合为一体,不加分离的,我认为最为理解的系统设计规范应是所有的定义与实现分离,尽管这可能对系统中的某些情况有点繁烦。 接口的本身反映了系统设计人员对系统的抽象理解。 接口应有两类:第一类是对一个体的抽象,它可对应为一个抽象体(abstract class); 第二类是对一个体某一方面的抽象,即形成一个抽象面(interface); 一个体有可能有多个抽象面。 抽象体与抽象面是有区别的。 2.设计接口的另一个不可忽视的因素是接口所处的环境(context,environment),系统论的观点:环境是系统要素所处的空间与外部影响因素的总和。任何接口都是在一定的环境中产生的。因此环境的定义及环境的变化对接口的影响是不容忽视的,脱离原先的环境,所有的接口将失去原有的意义。 3.按照组件的开发模型(3c),它们三者相辅相成,各司一面,浑然一体,缺一不可。 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题
我希望的是尽量少的修改代码,就能满足他的需要。我可以抽象如下接口:
以下为引用的内容:
package org.bromon.test;
public interface db
{
java.sql.connection opendb(string url,string user,string password);
void close();
}
这个接口只定义两个方法,没有任何有实际意义的代码,具体的代码由实作这个接口的类来给出,比如mysql教程.java:
以下为引用的内容:
package org.bromon.test;
import java.sql.*;
public class mysql implements db
{
private string url=”jdbc:mysql:localhost:3306/test”;
private string user=”root”;
private string password=””;
private connection conn;
public connection opendb(url,user,password)
{
//连接数据库教程的代码
}public void close()
{
//关闭数据库
}
}
下面看实例
<?php
interface js{
function ys($a,$b);
}class af implements js{
function ys($a,$b){
return "加法运算......结果为:".($a+$b);
}
}class jf implements js{
function ys($a,$b){
return "减法运算......结果为:".($a-$b);
}
}
class aaf implements js{function ys($a,$b){
return "乘法运算......结果为:".($a*$b);
}
}
class jjf implements js{function ys($a,$b){
return "除法运算......结果为:".($a/$b);
}
}
class modf implements js{function ys($a,$b){
return "取模运算......结果为:".($a % $b);
}
}
class china implements js{
public $varl=null;//这里直接:public $varl = new nothingx(); 会出错。
function __construct(){
$this->varl = new nothingx();
}
function ys($a,$b){
return $this->varl->say();
}
}
/*也可以用继承的方式实现哟:
class china extends nothingx implements js{
function ys($a,$b){
return parent::say();
}
}
*/
class nothingx{
function say(){
return "我什么运算都不做...只是为了实现<font color=#990000><b>‘耦合设计模式’</b></font>...我是出来打酱油的......";
}
}
class test{
private $one;
private $two;
public function __construct($x,$y){
$this->one=$x;
$this->two=$y;
echo "<font size=20px><strong>面向对象程序设计——接口</font></strong><hr>class test初始化:<br>属性$one=".$this->one." 属性$two=".$this->two."<hr>";
}
function display(js $a){
return "<font color=#990000><b>用php接口技术实现的运算——开始运算啦:</b></font><hr>".$a->ys($this->one,$this->two)."<hr>";
}
}
$t=new test(103,2);
$t1=new jf;
$t2=new china;
echo $t->display($t1);
echo $t->display($t2);
?>
好处
在小项目中,是体验不到的。使用接口编程,易于程序扩展,降低程序耦合性。
举个常用的例子说吧,你有个方法为:public viod doxx(arraylist arraylist),方法调用时,参数必须为arraylist对象。某天,当参数需要更换为其他集合类时,必须更改代码;此时如果用接口的话,就不须了;将方法更改为public viod doxx(list list),方法调用时,参数就很灵活了,可以传入arraylist、linkedlist等等,这样从而降点耦合了。
php教程正则中文表达式
$str = "abc一二三cde";
echo preg_replace('/[^x4e00-x9fa5]/i'," ",$str);$str = "php编程";
if (preg_match("/^[x4e00-x9fa5]+$/u",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}?>
<?php
$action?=?trim($_get['action']);
if($action?==?"sub")
{
$str?=?$_post['dir'];?
//if(!preg_match("/^[".chr(0xa1)."-".chr(0xff)."a-za-z0-9_]+$/",$str))?//gb2312汉字字母数字下划线正则表达式
if(!preg_match("/^[x{4e00}-x{9fa5}a-za-z0-9_]+$/u",$str))?//utf-8汉字字母数字下划线正则表达式
{?
echo?"<font?color=red>您输入的[".$str."]含有违法字符</font>";?
}
else?
{
echo?"<font?color=green>您输入的[".$str."]完全合法,通过!</font>";?
}
}
?>
<form?method="post"?action="?action=sub">
输入字符(数字,字母,汉字,下划线):
<input?type="text"?value="">
<input?type="submit"?value="提交">
</form>
php教程正则中文多种验证方法
gb2312汉字字母数字下划线正则表达式
preg_match("/^[".chr(0xa1)."-".chr(0xff)."a-za-z0-9_]+$/",$str);
再看一判断实例
$str = "中国";
//if (preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/", $str)) { //只能在gb2312情况下使用
if (preg_match("/^[x7f-xff]+$/", $str)) { //兼容gb2312,utf-8
echo "正确输入";
} else {
echo "错误输入";
}
编码表
双字节字符编码范围
1. gbk (gb2312/gb18030)
x00-xff gbk双字节编码范围
x20-x7f ascii
xa1-xff 中文 gb2312
x80-xff 中文 gbk
2. utf-8 (unicode)
u4e00-u9fa5 (中文)
x3130-x318f (韩文
xac00-xd7a3 (韩文)
u0800-u4e00 (日文)
php正则表达式匹配中文的
preg_match('/^[xa1-xff0-9a-za-z]+$/',$val)
更详细代码
$val=$_get[name];
if (preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/", $val))
{
//要执行的表达式
}
else
{
//要执行的表达式
}
php中来判断字符串是否为中文
if (preg_match("/^[u4e00-u9fa5]+$/",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}
相关文章
- 下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
Jupyter Notebook读取csv文件出现的问题及解决
这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06- 有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
php无刷新利用iframe实现页面无刷新上传文件(1/2)
利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25- 本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
- 要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
- 又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
- 本文实例讲述了jQuery实现文件上传进度条效果的代码。分享给大家供大家参考。具体如下: 运行效果截图如下:具体代码如下:<!DOCTYPE html><html><head><meta charset="utf-8"><title>upload</title><link rel="stylesheet...2015-11-24
- 今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
- 本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
- 这篇文章主要介绍了C#使用StreamWriter写入文件的方法,涉及C#中StreamWriter类操作文件的相关技巧,需要的朋友可以参考下...2020-06-25
ant design中upload组件上传大文件,显示进度条进度的实例
这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29- 举一个案例:复制代码 代码如下:<?phpclass Downfile { function downserver($file_name){$file_path = "./img/".$file_name;//转码,文件名转为gb2312解决中文乱码$file_name = iconv("utf-8","gb2312",$file_name...2014-06-07
- 这篇文章主要介绍了C#路径,文件,目录及IO常见操作,较为详细的分析并汇总了C#关于路径,文件,目录及IO常见操作,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25