zoukankan      html  css  js  c++  java
  • php对uploads文件的处理问题的解决

    解决uploads问题的要点有几点:

    参考这篇文章
    第一,
    在php.ini文件中, 有file_uploads这一节
    file_uploads = On ;是否开启文件上传功能, 该功能有很大的安全问题, 需要进行身份权限验证然后才允许上传
    upload_tmp_dir = 'c:/wamp/tmp' ;如果没有设置, 就使用系统默认的临时目录
    upload_max_filesize = 2M
    **注意upload(s)的写法.

    第二,
    还要注意 post 本身 允许传送表单的最大数据: post_max_size = 8M 默认的是8M, 如果上面的upload_max_filesize=10M ,
    这里也只会传送8M的最大文件, 通常要设置成: post_max_size 大于> upload_max_filesize.

    第三,
    还要注意脚本执行的时间限制, 因为上传文件 的时间对大文件, 可能需要的时间是比较长的, 所以, 要设置
    max_execution_time = 0, 默认的是 30second

    ;;;;;;;;;;;;;;;;;;;
    ; Resource Limits ;
    ;;;;;;;;;;;;;;;;;;;
    
    max_execution_time = 30     ; Maximum execution time of each script, in seconds
    max_input_time = 60	; Maximum amount of time each script may spend parsing request data
    memory_limit = 256M      ; Maximum amount of memory a script may consume (8MB)
    

    第四,
    max_input_time 以秒为单位对通过POST、GET以及PUT方式接收数据时间进行限制。
    如果应用程序所运行环境处在低速链路上,则需要增加此值以适应接收数据所需的更多时间

    memory_limit

    所以, 综上所述, 就是对上传文件, 一般有类型和文件大小的限制, 这也理解文件上传的大小一般不超过2M .


    在表单数据回传到服务器上时, 浏览器要对表单中的数据进行编码, enctype=EncodeType属性就表示编码类型

    一般不需要写, 就采用默认属性了,
    但是在上传文件或pdf等时, 就一定要设置这个form属性了,
    共有三个值:
    application/x-www-form-urlencoded: 表示将+编码为空格, 特殊字符用ascii的十六进制编码. 这个就是form的默认编码
    multipart/form-data: 用于上传文件,图片等二进制内容时
    text/plain: 用于上传纯文本内容, 而不是将form的input等控件的内容作为html内容上传

    关于$_FILES 全局变量

    在form表单中,可以同时包含多个文件域, 每个name都将作为区分上传文件的下标
    $_FILES, 注意是files,复数, 所以, 它是所有的全局系统变量中, 如$_GET, $_POST, COOKIE ,SESSION等, 唯一的一个二维数组!
    每个下标, 表示一个上传的文件的信息.
    $_FILES['file1']包含5个元素:
    error: 等于0 ,表示上传成功, 1,2.3,4,5都表示错误:
    name: 原来的名字,
    type: 原来文件的mime类型
    size: 文件大小, 以byte为单位
    tmp_name:临时文件名.

    mime:multipurpose internet mail extension: 多功能,多用途网络/网际邮件扩展协议, 用在浏览器上表示多媒体的"打开"类型..,图片的mime类型: image/gif, image/png, image/jpeg/pjpeg(ie)
    tmp_name是上传文件的临时文件, php随机生成的, 因为文件上传后, 为了安全! 并不允许直接放在 网站的目录中, 必须对文件进行安全检查等 操作后, 才允许 copy 使用(move_uploaded_file函数)到 站点的目录中去.

    move_upload_file()总是失败?

    是因为apache中的权限问题
    而upload_tmp_dir中的文件, 总是在脚本执行完毕后, 就把这些上传的临时文件给删除了的.所以你是看不到的.
    因为apache本身做了权限设置, 只允许php程序浏览 网站跟目录, 不允许浏览服务器硬盘目录.

    配置选项:(这个是在linux中)
    php_admin_value open_basedir localhost/wish/
    php_admin_value upload_tmp_dir localhost/wish/tmp

    php的echo可以输出script脚本, 如:

    $old_file = "";
    $old_file = "/folder/file.WAV";//这里是需要替换的文件,不在apache的目录下,是全局目录,绝对路径,folder是755权限,file的权限是644
    $file = $_FILES['file']['tmp_name'];
    if(is_uploaded_file($file)){
        if(@move_uploaded_file($_FILES['file']['tmp_name'], $old_file)){
            echo '<script>alert("替换成功");window.location="index.php";</script>';
        }else{
            echo '<script>alert("替换失败");window.location="index.php";</script>';
        }
    }else{
        echo '<script>alert("上传失败");window.location="index.php";</script>';
    }
    

    在windows中, 要解 move_uploaded_file()失败的问题,

    windows中, 权限应该不是问题,

    问题是: move...函数的目标路径/文件名 参数, 中的目标路径, 应该是: 绝对路径!

    绝对路径要用 __FILE__来获得, 而不是用 $_SERVER['SCRiPT_NAME']
    函数是dirname, 不是basedir!
    用$app_path = dirname (FILE). 就获得绝对路径 然后目标参数就用: $app_path. '/uploads'. $old_name.
    $_SERVER['scRIT_NAME']得到的是 相对 网站的根路径: "/APP/..." 这个是相对路径, 要出错!!

    move_uploaded_file($_FILES['upfile']['temp_name'], $app_path.'/uploads/'.$old_name)
    第一个参数就是临时文件名, 不用再加临时路径, ...

    the whole code is the following:

    <title>无标题文档</title>
    <style type="text/css">
    .error {
    	font-size: 16px;
    	color: red;
    	background: #FC3;
    	border: 1px dotted #60F;
    	height: 50px;
    	 800px;
            line-height: 50px;
            text-align: center;
    }
    </style>
    </head>
    
    <body>
    <form method="post" enctype="multipart/form-data">
      <input type="file"  name="upfile">
      <br/>
      <input type="submit" value="upload">
    </form>
    <pre>
    <?php
    $app_path = dirname(__FILE__);
    
    $uf = $_FILES['upfile'];
    
    if($uf['error'] == 0) {
    	$name = $uf['name'];
    	if(($uf['type'] != 'image/gif' && $uf['type'] != 'image/png' && $uf['type'] != 'image/jpeg' && $uf['type'] != 'image/pjpeg' ) || $uf['size'] > 2000000){
    			echo '<p class="error">Error: the type of file uploaded is not image or filesize is more than 2M'.'</p>';
    			exit;
    		}else{
    			echo "uploaded file's name is: ".$name.'<br/>';
    			echo 'the size of file uploaded is : '. (round($uf['size']/1024/1024,2)).'MB<br/>';
    		}
    
    	/* Note: In function 'iconv' below, the first parameter must be utf-8, 
    	 * and cann't be utf8! 
    	 */
    	if(move_uploaded_file($uf['tmp_name'], $app_path.'\myuploaded\'.iconv('utf-8','gb2312//ignore',$name))){
    		echo 'uploading file is completed successfully'.'<br/>';
    	}else{
    		echo '<p class="error"> Warning: uploading file is failed</p>';	
    	}
    }else{
    	echo '"<p class="error">error: file uploading is failed: '.$uf['error'].'</p>';	
    }
    
    
    
    ?>
    </pre>
    </body>
    
  • 相关阅读:
    POJ1417 True Liars
    POJ2912 Rochambeau
    POJ3904 Sky Code
    [SDOI2016]排列计数
    POJ2947 Widget Factory
    HDU5015 233 Matrix
    Problem 2242. -- [SDOI2011]计算器
    POJ2480 Longge's problem
    Problem 2818. -- Gcd
    LA3510 Pixel Shuffle
  • 原文地址:https://www.cnblogs.com/bkylee/p/5371952.html
Copyright © 2011-2022 走看看