poetbi / boaphp

boaPHP是一款免费开源、灵活易用的配置式PHP框架,MVC设计模式,完全面向对象,易学易用、便于快速开发
Apache License 2.0
56 stars 3 forks source link

上传文件这个改名 #16

Open ziqiming opened 5 days ago

ziqiming commented 5 days ago

需求是这样的

上传一张原图和同时一张使用前端裁剪插件的小图

要把这两张图片保存到

./file/img/956544.png ./file/img/thumb/956544.png

$up = boa::upload()

$up->cfg('path' , $this->up->cfg('path') . 'img/');

//问题在这里面,,前端上传的有可能是JPG,,这只改ID名字,后缀名不能写死,这个时候还没有得到图片资源呢? $up->cfg('name' , $this->id . '.png'); $file = $up->one('max');

$up->cfg('path' , $this->up->cfg('path') . 'thumb/'); $file = $up->one('min');

就是说这个改名字,起始就是想之改文件名,不改后缀名啊。。好麻烦啊

poetbi commented 4 days ago

方法1:上传的时候可以不指定名称,上传后重命名并转换,然后删除原先图片; 方法2:可以上传时统一指定为png后缀,上传后同名覆盖并转换;

$up = ...... //图片上传过程,上传 1.jpg $res = $up->get_file(); //获取上传后结果(数组)

if($res['file'] 的文件类型不是png){   $im = boa::image()->open($res['file']); //打开上传后的图片   $file = $im->save('路径/1.png'); //重命名并转换为1.png保存   unlink($res['file']); //使用方法1时 删除原先的图片 }

上传是上传,转换是转换,请分别参考: 手册 > 附录 > upload类 和 image类

poetbi commented 4 days ago

文件类型:boa::fileinfo类

ziqiming commented 4 days ago

其实我也想过改名后再删除,可这样就是双倍IO消耗,而且对业务逻辑代码体验不够好,本来可以简化的处理缺为了这个点增加了很多精力和时间,用框架不就应该越简便越好吗?本来在这个name方法上简单处理的事情,这个name的用处我也想不到了。

ziqiming commented 4 days ago

方法1:上传的时候可以不指定名称,上传后重命名并转换,然后删除原先图片; 方法2:可以上传时统一指定为png后缀,上传后同名覆盖并转换;

$up = ...... //图片上传过程,上传 1.jpg $res = $up->get_file(); //获取上传后结果(数组)

if($res['file'] 的文件类型不是png){   $im = boa::image()->open($res['file']); //打开上传后的图片   $file = $im->save('路径/1.png'); //重命名并转换为1.png保存   unlink($res['file']); //使用方法1时 删除原先的图片 }

上传是上传,转换是转换,请分别参考: 手册 > 附录 > upload类 和 image类

后续工作太多了 图片文件可以用boa::image重新保存并删除原图

文件格式呢?boa::file 没有save,没有copy.没有移动,没有删除 还要原生写啊

$file = boa::file(); $file->copy('源文件','复制到'); $file->del('源文件' , '复制到');

为什么不加这种方法,文件操作居然没有增删改

文件上传。我修改了文件上传路径 $up->cfg('path' , 'img/');

上传还会自动加上 年/月/日 的文件夹我老天啊。。

ziqiming commented 4 days ago

boa::image()->save()

保存前还要先创建文件夹。方法不能自动创建吗

poetbi commented 3 days ago

手册 > 附录 > upload类 和 image类 再强调一遍,多看手册可以解决90%+的常见问题

不需要你说的boa::file,我给你的例子就是完整带转换的 文件路径可以自定义,多看手册

如果不想后端这么做,可以方法3:用JS转换图片格式后上传

写代码,越简单,越潇洒 物物而不物于物,不要为代码而代码

poetbi commented 3 days ago

boa::file() 只是改名 boa::image() 不仅可以改名,还可以格式转换

图片不仅是改名,还需要格式转换 要不后端转换,要不前端用JS转换后上传

poetbi commented 3 days ago

方法4:直接改个后缀就可以(适合要求不严格的)

上传时不管什么格式,统一命名xxx.png,浏览器可以显示

ziqiming commented 3 days ago

image

poetbi commented 3 days ago

为更方便使用,image类将在下个小版本优化调整下

ziqiming commented 3 days ago

其实 更应该优化的是

upload

1、指定了设置目录,不应该按年月日再目录下面生成 年月日等文件夹 当前系统默认目录为 www/file 上传默认为文件为 www/file/2024/12/01/文件.png 应该有一个关闭这个自动生成年月日文件夹的配置

  用户自定义上传目录后  www/file/img   上传文件应该为  www/file/img/文件.png

2、修改文件名的处理 $up->cfg('name' , '新名字');

 如用户上传xls文件 配置了修改名字  默认结果为  www/file/2024/12/01/新名字

 这里我认为结果应该为   www/file/2024/12/01/新名字.xls

 除非我理解这个name的用法不是这样用的,,那就应该有一个新的方法,比如 $up->cfg('setName' , '新名字');  不要改变后缀名
poetbi commented 2 days ago

看手册 如果手册表述不明确,我下个版本修订

  1. 设定name就不会自动生成名称

$up = boa::upload() $up->cfg('path' ,'D:/test/'); $up->cfg('name' ,'1.jpg'); //单纯名称,结果:D:/test/1.jpg $up->cfg('name' ,'/a/1.jpg'); //相对路径,结果:D:/test/a/1.jpg $up->cfg('name' ,'D:/test/b/1.jpg'); //绝对路径,结果:D:/test/b/1.jpg

看手册,每个上传方法第二个参数指定保存路径,等同于设定name,例子同上

  1. 看源码,如果想每个上传自动加上后缀,打开/boa/upload.php 修改202行:$name = ltrim($name, ' /'); 改为:$name = ltrim($name, ' /') .".$ext"; 这在下个版本中更新,包括手册中表述和用例,开源的意义的就在这!
ziqiming commented 2 days ago

设置了 $up->cfgh('name' , '文件名' ) 确实是不自动生成文件名,但是需要提前把后缀名写上,否则文件改名不带后缀名,这个是我在上传模块上遇到最大的坑

因为配置项时还不知道用户上传的文件是什么后缀名 $file = $up->get_file(); get_file后才能得到后缀名,可这个时候已经把文件上传成功了。

这样一来,后面就有一系列的改名复制工作,要么就需要和前端沟通写死那个页面支持的格式后缀名。而不能上传其他了,没有灵活性了 上传的文件名和后缀名必须是两个处理才具有灵活性。

希望是在上传之前就把文件需要配置的做完然后上传好的文件几乎不用动

我其实也可以强制修改框架,但是后面就不能与新版本同步,或者说是预新版本同步就有一些特别注意的工作。

另外我看到源码里面 upload 方法里面有对后缀名的单独变量,应该在 get_file 返出来!

poetbi commented 2 days ago

自动加后缀按照前面说的改就行了 小版本的更新可以直接覆盖,保证兼容 这是写在 README.md 里面的话