首页 > 编程知识 正文

php提供上传文件的实际名称,php上传文件夹

时间:2023-05-05 07:36:06 阅读:265295 作者:4848

一、前言

      上传图片的时候,如果要修改图片的后缀,那需要先获取该图片的临时存储文件,然后用GD库函数打开,获取图片资源,然后重新定义后缀存储,那么这个临时文件是什么呢,图片资源和咱们平时所用的文件资源又有什么区别呢?生成的临时文件不能用GD库函数读取怎么办?

二、首先是生成的临时文件不能被imagecreatefrompng()正确打开

1、报错:

"imagecreatefrompng(): 'C:\Users\ZY\AppData\Local\Temp\php9A06.tmp' is not a valid PNG file "

      根据报错信息,我们知道用imagecreatefrompng函数打开临时文件失败。并且经过实验,发现这算是个小概率的问题,其他的图片临时文件都是可以正常获取图片资源的。

2、既然不能使用GD库函数,那能不能使用其他的函数读取该文件呢

博主试了下使用fopen,file_get_contents等打开,但是打开的资源不是图片资源,在后续的存储中,由于是用:

$result = imagejpeg($im, $file_path);

来存储的,所以要求参数必须是图片资源。最终是选用move_uploaded_file($filePath, $file_path)直接保存。

3、关于$_FILES[‘tmp_name’]解释

$_FILES['excel']['tmp_name'] 表示的就是上传临时文件的绝对路径上传临时文件的生存周期与处理上传的php程序相同(即程序结束,临时文件消失)move_uploaded_file 函数可使临时文件提前消失

4、php的tmp临时文件

      关于临时文件,大概查了下,在php向服务器上任意php文件以 form-data 方式提交请求上传数据时,会生成临时文件,通过phpinfo来获取临时文件的路径以及名称。大概就是php*.tmp这种格式的。一般来说在程序结束的时候,会自动回收,也就是自动删除掉这些文件

参考链接:
更改php临时文件的目录等:
https://www.racent.com/blog/how-to-change-directory-for-temporary-php-files/
https://codeday.me/bug/20180809/216024.ht

三、图片资源和文件资源的区别

      根据以上部分,我们知道图片资源和文件资源是不一样的。我们使fopen,file_get_contents等函数读取的文件,返回的都是文件资源。而使用imagecreatefrompng()函数返回的是图片资源。提到资源,就不得不提最开始学php的时候,我们那时候都知道,php有资源类型,只是后来用的少,慢慢的忘记了。

大概解释:
      资源数据类型是PHP4引进的。资源是一种特殊的变量类型,保存了到外部资源的一个引用:如打开文件、数据库连接、图形画布区域等。

区别:
      图片资源和文件资源的区别就是类型不同,虽然都是属于php的资源类型,但是代表的含义却不同,具体表现为指向的真实存储位置不一样。这里的图像资源更偏向于画布,或者是空白的画布,而文件资源更多是二进制的文件流等。

      虽然经过各种查询,大概明白了一些东西,但还是感觉差点劲,这些差距还是似懂非懂的,继续查询。

四、关于资源类型

1、打印一下资源返回值

$file=fopen('index.txt',r); echo $file; 发现输出的值是 :Resource id #3

2、解释

资源类型又称之为句柄,句柄是用来标识对象的,以便引用。句柄是一个无符号整数,句柄是一个指针的指针。

指针的指针可以理解为:

      指针的概念是指向变量地址的数据,指针的指针就是说这个指针的值是表示他指向的那个指针的地址。我们打印资源类型,返回的Resource id #3,可以理解为一个编号,php解释器通过这个编号从而获取到外部资源的具体地址,也方便我们接下来对于这个外部资源进行一些操作。

      这么一解释,哎,有点意思了,下面继续查找。

3、更深入解释资源

      PHP的zval可以表示广泛的数据类型,但是对于自定义的数据类型却很难充分描述。由于没有有效的方式描绘这些复合结构,因此也没有办法对它们使用传统的操作符。要解决这个问题,只需要通过一个本质上任意的标识符(label)引用指针,这种方式被称为资源。

      在zval中,对于resource,lval作为指针来使用,直接指向资源所在的地址。Resource可以是任意的复合结构,我们熟悉的mysqli、fsock、memcached等都是资源。(这句也解释了我们上面说的,指针的指针,通过指针指向一个key的地址,这个key同时又指向了真正的资源地址,所以这个key本身也是个指针

4、如何使用资源

(1)注册:
      对于一个自定义的数据类型,要想将它作为资源。首先需要进行注册,zend会为它分配全局唯一标示。

(2)获取一个资源变量:
      对于资源,zend维护了一个id->实际数据的hash_tale。对于一个resource,在zval中只记录了它的id。fetch的时候通过id在hash_table中找到具体的值返回。

(3)资源销毁(释放句柄函数):
      资源的数据类型是多种多样的。Zend本身没有办法销毁它。因此需要用户在注册资源的时候提供销毁函数)。当unset资源时,zend调用相应的函数完成析构。同时从全局资源表中删除它。(这部分就是为什么咱们在使用函数获取资源的时候,最后都要手动释放下资源。)

参考链接:
php中的资源类型:https://www.php.net/manual/zh/resource.php
php句柄的一个讨论:https://bbs.csdn.net/topics/350023072
php的资源:https://cloud.tencent.com/developer/article/1055801

      通过以上的种种解释,博主心里对于资源类型是有了一个更具体的了解,这种复杂类型不能像其他基础类型那样直接表示出来,所以就在内部搞个哈希表又存储了一下外部资源的地址和指针。我们打印出来的资源类型后面都是带有不同的id的,就像咱们平时用数据库一样,通过id查找具体数据,有点像的。

end

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。