php上传文件——单个文件

  这里我们说一下php实现单个文件的上传功能。

  php实现文件的上传,我目前用过两种方式:

  1.直接把文件通过二进制格式(blob)存储在mysql中,如图

    

    

    
1     $image = mysqli_escape_string($conn,file_get_contents($_FILES['photo']['tmp_name']));  
2     $type = $_FILES['photo']['type'];  
3     $sqlstr = "insert into pphoto(type,binarydata,time,username) values('".$type."','".$image."',now(),'".$_COOKIE['username']."')";  
4     mysqli_query($conn,$sqlstr) or die(mysql_error());  
View Code

 

    

    这种上传方法可以不通过文件系统,个人觉得比较比较有隐私性

    但是这种方法从数据库中检索图像会导致比使用文件系统更大的开销。而且不适合使用索引查找。在我以前的小项目中发现这种方法输出受限制,在输出多个文件或者实现轮播功能中比文件系统难的多。所以这里我就大概的讲一下。

  2.通过上传文件到文件系统再上传文件路径到数据库。

 

    <form name="form2" method="post" action="photo.php?action=2" enctype="multipart/form-data"> 
        图片:<input type="file" name="file>
        <input type="hidden" name="upload" value="add2">
        <input type="submit" name="b2" value="提交">                   
    </form>

    1)post方法更加安全,post请求会把请求的数据放置在HTTP请求包的包体中,而且不限制文件的大小,get方法请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输,除此之外,GET请求提交的数据还可能会造成Cross-site request frogery攻击。

    2)enctype="multipart/form-data" 在使用包含文件上传控件的表单时,必须使用该值。

    3)当点击提交后跳转到action中的php文件中

    

    <?php 
     header("Content-Type: text/html;charset=utf-8");
        $file=$_FILES['file'];//获取文件
        $name=$file['name'];//获取文件名
        $type=strtolower(substr($name, strrpos($name, '.')+1));//获取文件后缀名
        $allow_type=array('jpg','jpeg','gif','png');
        if(!in_array($type, $allow_type)){//判断是否符合上传类型
            return ;
        }
        if(!is_uploaded_file($file['tmp_name'])){
            return ;
        }
        $finalname=time().rand(1000,9999).".".$type;
        $upload_path="../project/".$finalname;//文件上传路径 可以添加:判断文件是否存在然后添加文件
        if(!move_uploaded_file($file['tmp_name'],iconv("UTF-8","gb2312",$upload_path))){//上传
            echo "头像上传失败";
        }
    ?>

    获取文件-》获取文件名-》判断文件格式大小等等是否符合要求-》上传

    注意问题:1.上传后会发生乱码 ,通过iconv()转换为gb2312格式

    

         move_uploaded_file($file['tmp_name'],iconv("UTF-8","gb2312",$upload_path))

    2.上传文件名覆盖问题,时间戳加随机数基本可以实现文件名不发生重复

     

      $finalname=time().rand(1000,9999).".".$type;

      

       

      这是上传文件的数组格式,有name type tmp_name error size

      name是文件名,type是类型,tmp_name是保存在服务器文件夹的临时文件名,error是错误类型,size是上传文件的大小

      error错误类型有:

            

    error1的解决方法:因为apache和php中有默认的最大上传大小,所以要在在php的php.ini中配置上传最大大小才能成功上传。1.最大上传大小(upload_max_filesize)2.form 最大post大小(post_max_size)最好在apache和php的php.ini中都配置了,我在php文 件中配置了最大大小发现重启服务器后还是上传失败,然后在apache中修改后成功上传。

            error4的解决方法:错误是因为客户端并没有上传文件就点击了提交,在点击提交后依然会发送给服务端一个文件数组,但是只有error=》4,size=》0. 通常情况下可以在上传前加一个$_FILES['file']['size']>0判断是否有数据传入防止这种错误。

 

     

 

    

转载于:https://www.cnblogs.com/IMBlackMs/p/7780999.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值