php学习笔记(三)——文件上传

这片笔记讲php文件上传的功能及遇到的一些问题。

先看php文件:

<?php
header("Content-type:text/html;charset=utf-8");
$backinfo = '';
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]); // 将文件名打散为数组,以‘.’为分隔符
$extension = end($temp);     // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif") //判断文件的格式
        || ($_FILES["file"]["type"] == "image/jpeg")
        || ($_FILES["file"]["type"] == "image/jpg")
        || ($_FILES["file"]["type"] == "image/pjpeg")
        || ($_FILES["file"]["type"] == "image/x-png")
        || ($_FILES["file"]["type"] == "image/png"))
    && ($_FILES["file"]["size"] < 204800)   // 小于 200 kb
    && in_array($extension, $allowedExts)) //在$allowedExts中查找是否含有上传文件的后缀名$extension
{
    if ($_FILES["file"]["error"] > 0)  //$_FILES["file"]["error"]>0:有错
    {
        $backinfo = "错误:: " . $_FILES["file"]["error"] . "<br>";
    } else{
            // 如果没有 upfiles 目录,你需要创建它,upfiles 目录权限为 777
            $dir = iconv("UTF-8", "GBK", "../upfiles");
            if (!file_exists($dir)){
                mkdir ($dir,0777,true);
            }
        // 判断当期目录下的 upfiles 目录是否存在该文件
        if (file_exists("../upfiles/" . $_FILES["file"]["name"]))
        {
            $backinfo = $_FILES["file"]["name"] . " 文件已经存在。 ";
        }
        else
        {
            // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
            move_uploaded_file($_FILES["file"]["tmp_name"], "../upfiles/" . $_FILES["file"]["name"]);
            $backinfo = $_FILES["file"]["name"] ."文件已上传";
        }
    }
}
else
{
    $backinfo = "非法的文件格式";
}
echo sprintf($backinfo); 

相关知识点:

 1.$_FILES["file"]["name"]:文件名称

 2.$_FILES["file"]["type"]:文件格式

 3.
$_FILES["file"]["size"]:文件大小

 4.$_FILES["file"]["error"]:文件错误代码
  0:表示没有错误,下面几种对应不同的错误
 1 : 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值.
 2 : 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
 3 : 文件只有部分被上传
 4 : 没有文件被上传
 $_FILES["file"]["error"] >0就是表示有错误发生

 5.
$_FILES["file"]["tmp_name"]:文件临时存储位置

 6.
explode(separator,string,limit)函数:把字符串打散为数组
    separator:必需。规定在哪里分割字符串。
    string:必需。要分割的字符串。
    limit:可选。规定所返回的数组元素的数目。
       可能的值:
       大于 0 - 返回包含最多 limit 个元素的数组
       小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组
       0 - 返回包含一个元素的数组

 7.end()函数:输出数组中最后一个值  

 相关:   

 current()-返回数组中的当前元素的值   

 next()-将内部指针指向数组中的下一个元素,并输出   

 prev()-将内部指针指向数组中的上一个元素,并输出   

 reset()-将内部指针指向数组中的第一个元素,并输出   

 each()-返回当前元素的键名和键值,并将内部指针向前移动

示例:

<?php
$people = array("Bill", "Steve", "Mark", "David");

echo current($people) . "<br>"; // 当前元素是 Bill
echo next($people) . "<br>"; // Bill 的下一个元素是 Steve
echo current($people) . "<br>"; // 现在当前元素是 Steve
echo prev($people) . "<br>"; // Steve 的上一个元素是 Bill
echo end($people) . "<br>"; // 最后一个元素是 David
echo prev($people) . "<br>"; // David 之前的元素是 Mark
echo current($people) . "<br>"; // 目前的当前元素是 Mark
echo reset($people) . "<br>"; // 把内部指针移动到数组的首个元素,即 Bill
echo next($people) . "<br>"; // Bill 的下一个元素是 Steve

print_r (each($people)); // 返回当前元素的键名和键值(目前是 Steve),并向前移动内部指针
?>
 8.
in_array(search,array,type)函数:搜索数组中是否存在指定的值
         search:必需。规定要在数组搜索的值。
         array:  必需。规定要搜索的数组。

     type:   可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。

 9.iconv():iconv方法是为了防止中文乱码,保证可以创建识别中文目录,不用iconv方法格式的话,将无法创建中文目录

 10.file_exists(path) :函数检查文件或目录是否存在,如果指定的文件或目录存在则返回 true,否则返回 false。

 11.mkdir(path,mode,recursive,context):函数创建目录,若成功,则返回true,否则返回false。 

   path:必需。规定要创建的目录的名称及路径。  

   mode:必需。规定权限。默认是0777。  

   recursive:必需。规定是否设置递归模式。  

   context:必需。规定文件句柄的环境。Context是可修改流的行为的一套选项。

 12.move_uploaded_file(file,newloc):将上传的文件移动到新位置。

    file:必需。规定要移动的文件。  

    newloc:必需。规定文件的新位置。

接下来看一下两种方式的做法:

 一、form表单上传

  使用form上传时,enctype属性值必须为multipart/form-data。 

 html:  

<form action="php/upload.php" method="post" enctype="multipart/form-data" >
            <input type="file" id="form-file" name="file">
            <input type="submit" value="上传">
        </form>
结果:
二、ajaxFileUpload.js插件上传
 先得引用ajaxFileUpload.js:
<script src="js/1.9.1jquery.min.js"></script>
    <script src="js/ajaxfileupload.js"></script>
  html:
<input type="file" id="file" name="file">
    <input type="button" id="file-btn" value="上传">
  js:
$("#file-btn").click(function () {
            $.ajaxFileUpload ({
                url:'./php/upload.php',
                secureuri:false, //是否启用安全提交,默认为false。
                fileElementId:'file',//与页面处理代码中file相对应的ID值
                dataType: 'text', //返回数据类型:text,xml,json,html,scritp,jsonp五种
                success: function (data) {
                        alert(data);
                }
            })
        })

 结果:

使用ajaxFileUpload.js遇到的问题:

jQuery.handleError is not a function

网上查找了一下这个错误的原因:版本1.4.2之前的版本才有handlerError方法

 解决办法:

ajaxFileUpload.js文件开头添加这一段代码(红色代码):

jQuery.extend({
    handleError: function( s, xhr, status, e )      {
        // If a local callback was specified, fire it
        if ( s.error ) {
            s.error.call( s.context || s, xhr, status, e );
        }
        // Fire the global callback
        if ( s.global ) {
            (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
        }
    },


    createUploadIframe: function(id, uri){...}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
文件上传是Web开发中常见的功能之一,Java中也提供了多种方式来实现文件上传。其中,一种常用的方式是通过Apache的commons-fileupload组件来实现文件上传。 以下是实现文件上传的步骤: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ``` 2.在前端页面中添加文件上传表单: ```html <form method="post" enctype="multipart/form-data" action="upload"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 3.在后台Java代码中处理上传文件: ```java // 创建一个DiskFileItemFactory对象,用于解析上传的文件 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置缓冲区大小,如果上传的文件大于缓冲区大小,则先将文件保存到临时文件中,再进行处理 factory.setSizeThreshold(1024 * 1024); // 创建一个ServletFileUpload对象,用于解析上传的文件 ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的大小限制,这里设置为10MB upload.setFileSizeMax(10 * 1024 * 1024); // 解析上传的文件,得到一个FileItem的List集合 List<FileItem> items = upload.parseRequest(request); // 遍历FileItem的List集合,处理上传的文件 for (FileItem item : items) { // 判断当前FileItem是否为上传的文件 if (!item.isFormField()) { // 获取上传文件的文件名 String fileName = item.getName(); // 创建一个File对象,用于保存上传的文件 File file = new File("D:/uploads/" + fileName); // 将上传的文件保存到指定的目录中 item.write(file); } } ``` 以上代码中,首先创建了一个DiskFileItemFactory对象,用于解析上传的文件。然后设置了缓冲区大小和上传文件的大小限制。接着创建一个ServletFileUpload对象,用于解析上传的文件。最后遍历FileItem的List集合,判断当前FileItem是否为上传的文件,如果是,则获取文件名,创建一个File对象,将上传的文件保存到指定的目录中。 4.文件上传完成后,可以给用户一个提示信息,例如: ```java response.getWriter().write("File uploaded successfully!"); ``` 以上就是使用Apache的commons-fileupload组件实现文件上传的步骤。需要注意的是,文件上传可能会带来安全隐患,因此在处理上传的文件时,需要进行严格的校验和过滤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mosowe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值