php 编写 实现上传图片至服务器的函数

php 编写 实现上传图片至服务器的函数,第1张

<?php

   class FileUpload{

      private $filepath   //指定上传文件保存的路径

      private $allowtype=array("gif","jpg","jpeg","png")//允许上传文件的类型

      private $maxsize=1000000//允许上传文件的最大值

      private $israndname=true//是否随机重命名,

      private $originName//源文件名字

      private $tmpFileName//临时文件名字

      private $fileType//上传后的文件类型,主要是文件后缀名

      private $fileSize//文件尺寸

      private $newFileName//新文件名字

      private $errorName=0//错误号

      private $errorMess=""//用来提供错误报告

        //用于对上传文件初始化

        //指定上传路径  2·允许的类型  3·限制大小  4·是否使用随机文件名称

        //让用户可以不用换位置传参数,后面参数给值不用按照位置或者必须有值

         function __construct($options=array()){

            foreach($options as $key=>$val){

                $key = strtolower($key)

            //查看用户参数中的数组下标是否和成员属性名相同

            //get_class_vars(get_class($this))得到类属性的数组

            //如果$key下标不在这个类属性的数组中,则退出for循环

               if (!in_array($key,get_class_vars(get_class($this)))){

                continue

                }

             $this -> setOption($key,$val)

         }

     }

         private function setOption($key,$val){

         //让实例化后获取过来的数组下标 = 数组下标的值,这里即为构造函数初始化

         //构造函数中调用,等于把所有属性初始化,将来可以直接访问

          $this -> $key=$val

         }

         private function getError(){

             $str="上传文件{$this->originName}时出错"

             switch($this -> errorNum){

                 case 4: $str.="没有文件被上传"

                 break

                 case 3: $str.="文件只有部分上传"

                 break

                 case 2: $str.="上传文件超过了表单的值"

                 break

                 case 1: $str.="上传文件超过phpini的值"

                 break

                 case -1: $str.="未允许的类型"

                 break

                 case -2: $str.="文件过大上传文件不能超过{$this->maxsize}字节"

                 break

                 case -3: $str.="上传文件失败"

                 break

                 case -4: $str.="建立存放上传文件目录失效,请重新上传指定目录"

                 break

                 case -5: $str.="必须指定上传文件的路径"

                 break

                 default: $str.="未知错误"

             }

             return $str.'<br>'

         }

         //用来检查文件上传路径

         private function checkFilePath(){

               if(empty($this -> filepath)){

                   $this -> setOption("errorNum",-5)

                   return false

               }

               if(!file_exists($this -> filepath) || !is_writable($this -> filepath)){

                       if(!@mkdir($this -> filepath,0755)){

                           $this -> setOption("errorNum",-4)

                           return false

                       }    

                     }

                     return true

               }

         //用来检查上传文件尺寸大小

         private function checkFileSize(){

            if($this -> fileSize > $this ->maxsize){

                  $this -> setOption("errorNum",-2)

                  return false

            }else{

            return true

            }

         }

         //用来检查文件上传类型

         private function checkFileType(){

                if(in_array(strtolower($this->fileType),$this -> allowtype)){

                     return true

                }else{

                //如果$this->fileType这个类型 不在$this -> allowtype这个数组中,则把错误号变成-1

                      $this -> setOption("errorNum",-1)

                      return false

                }

         }

         private function setNewFileName(){

              if($this -> israndname){

                       $this -> setOption("newFileName",$this->preRandName())

              }else{

                      $this -> setOption("newFileName",$this -> originName)

              }

         }

         //用于检查文件随机文件名

         private function preRandName(){

                $fileName=date("Ymdhis").rand(100,999)

                return $fileName.".".$this -> fileType

         }

         //用来上传一个文件

      function uploadFile($fileField){

            //检查文件路径

            $return = true

          if(!$this -> checkFilePath()){

               $this -> errorMess=$this -> getError()

               return false

            }//获取文件信息

             $name     = $_FILES[$fileField]['name']

             $tmp_name = $_FILES[$fileField]['tmp_name']

             $size     = $_FILES[$fileField]['size']

             $error    = $_FILES[$fileField]['error']              

          if(is_array($name)){//判断获取过来的文件名字是否为数组

              $errors=array()//如果为数组则设置为一个数组错误号

                 for($i=0$i<count($name)$i++){

                  //循环每个文件即每个类属性赋值或者说初始化属性值 或者初始化构造函数

                     if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i])){

                         if(!$this->checkFileSize() || !$this->checkFileType()){

                          //如果上面尺寸或者类型不对,则调用这个错误信息

                             $errors[$i]=$this->getError()

                             $return=false

                         }

                     }else{

                      //这里是

                      $error[]=$this->getError()

                      $return=false

                     }

                     if(!$return)

                      $this->setFiles()

                 }

                 if($return){

                  $fileNames=array()

                    for($i=0$i<count($name)$i++){

                      if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i])){

                             $this->setNewFileName()

                         if(!$this->copyFile()){

                           $errors=$this->getError()

                           $return=false

                         }else{

                          $fileNames[$i]=$this->newFileName

                         }

                          }

                    }

                       $this->newFileName=$fileNames

                 }

           $this->errorMess=$errors

           return $return

                 

          }else{

            //看看$name,$tmp_name,$size,$error这些是否赋值成功 否则返回FALSE

            if($this -> setFiles($name,$tmp_name,$size,$error)){

            //看看文件大小尺寸是否匹配,不匹配返回FALSE

                    if($this -> checkFileSize() && $this -> checkFileType()){

                          //获取新文件名

                          $this->setNewFileName()

                            if($this->copyFile()){

                                return true

                            }else{

                               return false

                            }

                    }else{

                    $return=false

                         }

    }else{

    $return=false

          }

                             if(!$return){

                        $this -> errorMess = $this ->getError()

                        return $return

                                 }

}

        }

    function copyFile(){//将文件从临时目录拷贝到目标文件夹

        if(!$this->errorNum){

           //如果传递来的路径有斜杠,则删除斜杠再加上斜杠

           //./upload+./

           $filepath=rtrim($this->filepath,'/').'/'

            //./upload+./+加上随机后的新文件名和后缀

            //这里指创建一个新的$filepath.这个文件 像占位符但是为空的

           $filepath.=$this->newFileName

          //尝试着把临时文件$this->tmpFileName移动到$filepath下哪里覆盖原来的这个文件

               if(@move_uploaded_file($this->tmpFileName,$filepath)){

                       return true

                   }else{

                     $this->setOption('errorNum',-3)

                     return false

                       }

        }else{

         return false

             }

        }

          //这里是为了其他剩余的属性进行初始化操作!

         private function setFiles($name="",$tmp_name="",$size=0,$error=0){

         //这里给错误号赋值

             $this -> setOption("errorNum",$error)

             //如果这里有错误,直接返回错误

               if ($error){

                   return false

               }

             $this -> setOption("originName",$name)//复制名字为源文件名

             $this -> setOption("tmpFileName",$tmp_name)

             $arrstr = explode(".",$name)//按点分割文件名,

             //取分割后的字符串数组最后一个 并转换为小写,赋值为文件类型

             $this -> setOption("fileType",strtolower($arrstr[count($arrstr)-1]))

             $this -> setOption("fileSize",$size)

             return true

         }

         //用来获取上传后的文件名

         function getNewFileName(){ 

              return $this -> newFileName

          }

         //上传失败,后则返回这个方法,就可以产看报告

         function getErrorMsg(){

                   return $this -> errorMess

         }

   }

?>

============================调用====================================

<?php

require("FileUpload.class.php")

//这里实例化后赋值为数组,数组的下标要对应类中属性的值,否则不能传递值,可以不分先后但是必须一致

$up = new FileUpload(array('israndname'=>'true',"filepath"=>"./upload/",'allowtype'=>array('txt','doc','jpg','gif'),"maxsize"=>1000000))

   echo '<pre>'

   if($up -> uploadFile("pic")){

     print_r($up -> getNewFileName())

   } else{

     print_r($up -> getErrorMsg())

   }

   echo '<pre>'

?>

-------------------HTML-------------------------

<html>

 <head>

<meta http-quive="content-type" content="text/htmlcharset=utf-8" ></meta>

 </head>

 <body>

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

                shoppic:<input type="file" name="pic[]"><br>

                <input type="hidden" name="MAX_FILE_SIZE" value="1000000">

                <input type="submit" name="sub" value="添加商品">

          </form>

 </body>

</html>

-------------------或者HTML-------------------------

<html>

 <head>

<meta http-quive="content-type" content="text/htmlcharset=utf-8" ></meta>

 </head>

 <body>

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

               //区别在这里

                shoppic:<input type="file" name="pic[]"><br>

shoppic:<input type="file" name="pic[]"><br>

shoppic:<input type="file" name="pic[]"><br>

                <input type="hidden" name="MAX_FILE_SIZE" value="1000000">

                <input type="submit" name="sub" value="添加商品">

          </form>

 </body>

</html>

=====================================================================

以上是自己总结的  还没有怎么精简加工过,仅供参考

以上不止可以上传图片,可以上自定义任何文件

<uses-permission android:name="android.permission.CAMERA" />

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"

tools:ignore="ProtectedPermissions" />

<uses-permission android:name="android.permission.READ_FRAME_BUFFER"

tools:ignore="ProtectedPermissions" />

$target_path = "./test/"//接收文件目录

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']) 

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 

  echo "The file ".  basename( $_FILES['uploadedfile']['name']). " has been uploaded" 

}  else{ 

  echo "There was an error uploading the file, please try again!" . $_FILES['uploadedfile']['error'] 

}

private static final String CHARST ="UTF-8"

public boolean uploadFile(File file,String RequestURL,String imgname) {

String BOUNDARY =UUID.randomUUID().toString()// 边界标识 随机生成

    String PREFIX ="--",LINE_END ="\r\n"

String CONTENT_TYPE ="multipart/form-data"// 内容类型

    try {

URL url =new URL(RequestURL)

HttpURLConnection conn = (HttpURLConnection)url.openConnection()

conn.setReadTimeout(50000)

conn.setConnectTimeout(50000)

conn.setDoInput(true)// 允许输入流

        conn.setDoOutput(true)// 允许输出流

        conn.setUseCaches(false)// 不允许使用缓存

        conn.setRequestMethod("POST")// 请求方式

        conn.setRequestProperty("Charset",CHARST)

// 设置编码

        conn.setRequestProperty("connection","keep-alive")

conn.setRequestProperty("Content-Type",CONTENT_TYPE +"boundary="

                +BOUNDARY)

if (file !=null) {

/** * 当文件不为空,把文件包装并且上传 */

            OutputStream outputSteam =conn.getOutputStream()

DataOutputStream dos =new DataOutputStream(outputSteam)

StringBuffer sb =new StringBuffer()

sb.append(PREFIX)

sb.append(BOUNDARY)

sb.append(LINE_END)

/**

            * 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件

            */

            sb.append("Content-Disposition: form-dataname=\"uploadedfile\"filename=\""

                    +imgname +".png" +"\"" +LINE_END)//file.getName()

            sb.append("Content-Type: application/octet-streamcharset="

                    +CHARST +LINE_END)

sb.append(LINE_END)

dos.write(sb.toString().getBytes())

InputStream is =new FileInputStream(file)

byte[]bytes =new byte[1024]

int len =0

// ImageView img = (ImageView) findViewById(R.id.imageView)

// Bitmap bitmap  = BitmapFactory.decodeStream(is)

// img.setImageBitmap(bitmap)

            while ((len =is.read(bytes)) != -1) {

dos.write(bytes,0, len)

}

is.close()

dos.write(LINE_END.getBytes())

byte[]end_data = (PREFIX +BOUNDARY +PREFIX +LINE_END).getBytes()

dos.write(end_data)

dos.flush()

dos.close()

/**

            * 获取响应码 200=成功 当响应成功,获取响应的流

            */

            int res =conn.getResponseCode()

Log.e("111","response code:" +res)

if (res ==200) {

return true

}

}

}catch (MalformedURLException e) {

e.printStackTrace()

}catch (IOException e) {

e.printStackTrace()

}

return false

}

new Thread() {

@Override

    public void run() {

String fileName =Environment.getExternalStorageDirectory().getAbsolutePath() +"/facepass/001.png"

File filePic =new File(fileName)

// uploadFile(filePic, "http://10.100.72.152/uploadimg1.php")

// uploadFile(filePic, "http://10.100.72.152/uploadimg1.php")

        uploadFile(filePic,"http://10.100.72.152/?c=preson&a=addimg","img")

}

}.start()

if (Build.VERSION.SDK_INT >=23) {

int REQUEST_CODE_CONTACT =101

String[]permissions = {

Manifest.permission.WRITE_EXTERNAL_STORAGE}

//验证是否许可权限

    for (String str :permissions) {

if (MainActivity.this.checkSelfPermission(str) !=PackageManager.PERMISSION_GRANTED) {

//申请权限

            MainActivity.this.requestPermissions(permissions,REQUEST_CODE_CONTACT)

return

}else {

//这里就是权限打开之后自己要操作的逻辑

        }

}

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/348202.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-07
下一篇2023-05-07

发表评论

登录后才能评论

评论列表(0条)

    保存