吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2600|回复: 10
收起左侧

[其他转载] thinkphp5 编辑器上传word转html

[复制链接]
Mybing 发表于 2020-10-13 18:14
最近客户要求后台需要能上传word 转html到编辑器中
因为网站是thinkphp5做的 编辑器是使用的百度编辑器 根据网上介绍写了这个功能
Q~AZ_1O)V6C$%JK]()5@O@M.png
PG4$NGA{G(2E`A491M`T[]1.png
先在页面合适的位置写个上传框
[HTML] 纯文本查看 复制代码
<button type=”button” name=”fileword” id=”upload-fileword”>上传word文件</button>

我这里是使用layui

[JavaScript] 纯文本查看 复制代码
<script> 
layui.use('upload', function () {
    	var upload = layui.upload;
        upload.render({
        	elem:'#upload-fileword', 
            accept:'file',
            url: '".url('upload/uploadword',['file'=>'file'])."',
            exts: 'docx', 
            done: function(data){
                if(data.status == 1){
                	UE.getEditor('".$field."').setContent(data.html);
                    layer.msg(data.msg,{icon:1,time:1500,shade: 0.1,});
                }else{
                    layer.msg(data.msg,{icon:2,time:1500,shade: 0.1,});
                }
             }
         });
     });
 </script>

php上传代码

[PHP] 纯文本查看 复制代码
$upload = new \tool\WordUpload(input('file')); 
$html = $upload->getHtml();
if ($html === false) {
    return json(['status' => 2, 'html' => $html, 'msg' => '解析失败']);
}else{
return json(['status' => 1, 'html' => $html, 'msg' => '解析成功']);
}

WordUpload文件 需要phpword包 自己下载
[PHP] 纯文本查看 复制代码
<?php
namespace tool;
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\Style\Font;
use PhpOffice\PhpWord\Shared\ZipArchive;
use PhpOffice\PhpWord\Settings;
use PhpOffice\PhpWord\Shared\Converter;
use PhpOffice\PhpWord\Style\TablePosition;

use think\facade\Env;
use think\facade\Config;
use think\File;
use think\Db;
/**
 * Class WordUpload
 * [url=home.php?mod=space&uid=1507498]@Package[/url] app\common\util
 * word 文档上传
 */
class WordUpload
{
    private $file;
    private $size;
    private $ext;
    private $savePath = '/upload/word/';
    private $errorMsg;
    private $delTmp = true;

    /**
     * WordUpload constructor.
     * [url=home.php?mod=space&uid=952169]@Param[/url] $file [上传的文件]
     * @param int $size [文件大小]
     * @param string $ext [允许的后缀]
     */
    public function __construct($file, $size = 1024, $ext = 'docx')
    {
        $this->file = $file;
        $this->size = $size;
        $this->ext = $ext;
    }

    public function getHtml(){
        $file = request()->file($this->file);
        if (!$file instanceof File) {
            $this->errorMsg = '请上传文件';
            return false;
        }
        //上传文件 根据站点选择目录
        $info = $file->validate(['size'=>$this->size,'ext'=>$this->ext])->move(Env::get('ROOT_PATH').'public/static'. $this->savePath);
        if(!$info){
            // 上传失败获取错误信息
            $this->errorMsg = $file->getError();
            return false;
        }
        try {
            //获取文件路径
            $tempDocx = Env::get('ROOT_PATH').'public/static'.$this->savePath.$info->getSaveName();
            $objWriter = IOFactory::createWriter(IOFactory::load($tempDocx), 'HTML');
            $tempHtml = Env::get('ROOT_PATH') . 'public/static'.$this->savePath .substr($info->getSaveName(), 0, strpos($info->getSaveName(), '.')) . '.html';

            $objWriter->save($tempHtml);
            $html = file_get_contents($tempHtml);
            if ($this->delTmp) {
                //删除临时文件
                register_shutdown_function(function () use ($tempHtml, $tempDocx){
                    unlink($tempHtml);
                    unlink($tempDocx);
                });
            }
            $html = $this->getHtmlBody($html);

            if ($html == '') {
                throw new \Exception('上传文件内容为空');
            }
            $html = $this->saveImage($html);
            $html = $this->clearStyle($html);
            $html = $this->clearSpan($html);
        } catch (\Exception $e) {
            $this->errorMsg = $e->getMessage();
            return false;
        }
        return $html;
    }

    /**
     * @param $html
     * [url=home.php?mod=space&uid=155549]@Return[/url] string
     * 匹配出body的内容
     */
    private function getHtmlBody($html) {
        preg_match('/<body>([\s\S]*)<\/body>/', $html,$matches);
        return isset($matches[1]) ? $matches[1] : '';
    }

    /**
     * @param $html
     * @return mixed
     * 图片处理
     */
    private function saveImage($html){
        //匹配图片
        ini_set('pcre.backtrack_limit', 9999999);
        preg_match_all('/<img[^>]*src="([\s\S]*?)"\/>/', $html,$imageMatches);
        if (!$imageMatches[1]) {
            return $html;
        }
        //print_r($imageMatches[1]);exit;
        $imageUrl = [];
        foreach ($imageMatches[1] as $image) {
            $imageUrl[] = $this->saveLocalBase64Image($image);
        }
        return str_replace($imageMatches[1], $imageUrl, $html);
    }

    /**
     * @param $base64_image_content
     * @return string
     * 保存图片到本地
     */
    private function saveLocalBase64Image($base64_image_content){
        $imge_web_url = '';
        if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
            //图片后缀
            $type = $result[2];
            //保存位置--图片名
            $image_name = date('His') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT). '.' . $type; //图片名称
            $image_file_path = $this->savePath .'image/'.date('Ymd'); //static/upload/word/image/20200522
            $image_file = Env::get('ROOT_PATH') .'public/static'. $image_file_path;
            $imge_real_url = $image_file . DIRECTORY_SEPARATOR . $image_name;
            $imge_web_url = '/static'.$image_file_path .  DIRECTORY_SEPARATOR . $image_name;
            
            if (!file_exists($image_file)){
                mkdir($image_file, 0700, true);
            }
            //解码
            $decode = base64_decode(str_replace($result[1], '', $base64_image_content));
            $res = file_put_contents($imge_real_url, $decode);
            
            return $imge_web_url;
        }
        return $imge_web_url;
    }

    /**
     * @param $content
     * @return null|string|string[]
     * 清除p,span标签的样式
     */
    private function clearStyle($content)
    {
        $patterns = array (
            '/<(p|span)[\s\S]*?>/i',
        );
        return preg_replace($patterns, '<$1>', $content);
    }

    /**
     * @param $content
     * @return null|string|string[]
     * 清除span标签
     */
    private function clearSpan($content)
    {
        $patterns = array (
            '/<span[\s\S]*?>/i',
            '/<\/span>/i',
        );
        return preg_replace($patterns, '', $content);
    }

    /**
     * @return mixed
     */
    public function getErrorMsg()
    {
        return $this->errorMsg;
    }

}

免费评分

参与人数 3吾爱币 +3 热心值 +2 收起 理由
pstree + 1 + 1 热心回复!
heroic + 1 我很赞同!
叶凯 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Mybing 发表于 2021-2-25 15:33
本帖最后由 Mybing 于 2021-2-25 15:39 编辑

123456789
xiaomingtt 发表于 2021-2-26 10:22
学习学习,我都是这样
[PHP] 纯文本查看 复制代码
				$phpWord = \PhpOffice\PhpWord\IOFactory::load($source);
				$phpWord->save($targetFile, "HTML");
5151diy 发表于 2021-2-28 20:31
xiaomingtt 发表于 2021-2-26 10:22
学习学习,我都是这样[mw_shl_code=php,true]                                $phpWord = \PhpOffice\PhpWord\IOFactory::load($source) ...

这个强,谢谢
netusb 发表于 2021-3-14 14:20
学习啦,支持支持
wt0413 发表于 2021-3-15 11:52
看着不错,先保存了
pstree 发表于 2021-3-26 17:29
学习了,也用上了,感谢分享
大侠在路上 发表于 2021-3-31 21:07
感谢楼主分享,学习一下。
5151diy 发表于 2021-4-1 07:50
学习学习了,谢谢
hxy 发表于 2021-4-1 08:42
牛啊牛啊
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 17:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表