mysql5的bolb字段,安装时默认是1M,会提示报错。

探讨MySQL中Blob类型的使用及max_allowed_packet参数调整方法,解决文件上传超过默认大小限制的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题情况】

 文件上传后要存在数据库里面,用blob类型,在oracle里面是运行正常的。  移植到mysql5的时候,上传报错,经过百度搜索,找到问题原因。mysql5的bolb字段,安装时默认是1M。


【异常提示】

Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (5856352 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3868)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2551)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2818)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2157)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2460)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2377)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2361)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)
... 67 more


【问题原因及解决办法】

MySQL的一个系统参数:max_allowed_packet,其默认值为1048576(1M),
查询:show VARIABLES like '%max_allowed_packet%';

修改此变量的值:
MySQL安装目录下的my.ini文件中的[mysqld]段中的"max_allowed_packet = 1M",(注意:有些mysql.ini文件中会没有这一行的)

找到[mysqld], 在这一行下面新增一行(本身有这行就修改)。改为31M。


max_allowed_packet = 31M

重起MySQL服务。
现在可以load大于1M的文件了


【顺便说一下mysql中blob的区别】

MySQL有四种BLOB类型:
TINYBLOB: 仅255个字符
BLOB: 最大限制到65K字节
MEDIUMBLOB: 限制到16M字节
LONGBLOB: 可达4GB

----------------------------------------

【有参考文章】http://hi.baidu.com/liyanqin2288/item/f0eb2b36b9fd5ecd2e8ec259

<think>好的,我现在需要解决用户在移动端H5中无法显示由Blob生成的PDF预览的问题。根据用户提供的引用内容,我需要先梳理现有的信息和可能的解决方案。 首先,用户提到原先的下载方式在PC端正常,但在移动端H5下载xls出现乱码,PDF显示空白。这可能涉及文件流的处理方式是否正确,比如Blob的类型是否正确设置。引用[1]指出H5下载xls乱码和PDF显示问题,可能需要检查响应头的Content-Type是否正确,以及是否正确处理了二进制数据。例如,xls乱码可能是因为没有正确设置Blob的MIME类型,或者前端在生成Blob没有正确指定类型,导致浏览器解析错误。同样,PDF无法显示可能是由于Blob类型错误或预览方式不支持移动端。 接下来,引用[2]提到移动端H5预览PDFIOS不兼容,签章不展示的问题。这里可能涉及PDF.js的兼容性问题。解决方案中提到了跨域问题和电子签章不展示,需要确保PDF文件允许跨域访问,并且PDF.js的版本支持签章渲染。此外,IOS可能对某些JavaScript API的支持不同,比如下载或渲染PDF的方式需要特别处理。 引用[3]总结了移动端显示PDF的三种方法,包括获取Blob流、调整PDF.js的清晰度等。其中提到使用PDF.js可以通过调整getViewport的参数来提升清晰度,这可能与Canvas渲染有关。如果PDF在移动端显示模糊,可以尝试增加参数值。此外,正确获取Blob流并传递给PDF.js是关键步骤,需要确认Blob是否正确生成,并且PDF.js能够正确解析。 现在,我需要将这些信息整合成解决方案。首先,确保Blob生成正确,检查MIME类型是否正确设置为application/pdf。其次,使用PDF.js进行渲染,注意跨域问题和IOS的兼容性处理。可能需要使用PDF.js的特定版本或配置,比如关闭worker以避免跨域问题。此外,对于签章不显示的问题,可能需要升级PDF.js到支持签章的版本。另外,针对移动端的显示优化,比如调整视口大小和清晰度参数,确保Canvas渲染清晰。最后,测试不同的移动端浏览器,特别是IOS的Safari,可能需要使用内嵌iframe或第三方库如react-pdf来增强兼容性。 可能还需要考虑其他因素,比如文件大小过大导致加载失败,或者移动端内存不足导致渲染问题。此外,检查控制台是否有报错信息,帮助定位问题根源。比如,跨域错误或安全限制可能阻止PDF.js正确加载资源。需要确保服务器正确配置CORS头,允许前端访问PDF文件。 总结步骤应该是:1. 正确生成Blob并设置MIME类型;2. 使用PDF.js渲染处理兼容性和跨域;3. 调整视口参数优化显示;4. 处理IOS特定问题,可能需要使用第三方库或替代方案。最后,测试验证解决方案是否有效。</think>针对移动端H5无法显示Blob生成的PDF预览问题,以下是分步解决方案: ### 一、核心问题定位 1. **Blob类型验证** 确保生成Blob指定正确MIME类型:`new Blob([data], {type: 'application/pdf'})`,避免浏览器误判文件格式导致解析失败[^1][^3]。 2. **跨域访问限制** 若PDF文件来自不同域,需服务端设置CORS响应头: ```http Access-Control-Allow-Origin: * Access-Control-Allow-Headers: Content-Type ``` ### 二、PDF渲染方案优化 #### 方案1:PDF.js基础配置 ```javascript // 加载PDF.js基础组件(推荐v2.11+版本) const loadingTask = pdfjsLib.getDocument({ url: URL.createObjectURL(blob), cMapUrl: 'https://unpkg.com/pdfjs-dist@2.11.338/cmaps/', cMapPacked: true }); loadingTask.promise.then(pdf => { pdf.getPage(1).then(page => { // 提升清晰度关键参数(建议2~3倍) const viewport = page.getViewport({ scale: 3 }); const canvas = document.createElement('canvas'); canvas.height = viewport.height; canvas.width = viewport.width; page.render({ canvasContext: canvas.getContext('2d'), viewport: viewport }).then(() => { document.body.appendChild(canvas); }); }); }); ``` **注意**: - 使用`URL.createObjectURL`转换Blob为临链接 - 通过`scale`参数调节渲染清晰度 #### 方案2:IOS兼容处理 ```javascript // 检测IOS设备使用iframe渲染 if (/iPad|iPhone|iPod/.test(navigator.userAgent)) { const iframe = document.createElement('iframe'); iframe.style.width = '100%'; iframe.style.height = '600px'; iframe.src = URL.createObjectURL(blob); document.body.appendChild(iframe); } else { // 正常使用PDF.js渲染 } ``` ### 三、电子签章特殊处理 若存在签章不显示问题: 1. 升级至**PDF.js v3.0+**(支持数字签名渲染) 2. 初始化启用签名验证: ```javascript pdfjsLib.GlobalWorkerOptions.workerSrc = '//mozilla.github.io/pdf.js/build/pdf.worker.js'; const loadingTask = pdfjsLib.getDocument({ data: blob, _disableRange: true, // IOS兼容选项 verbosity: 1 // 开启调试信息 }); ``` ### 四、替代方案 若仍存在兼容性问题,可尝试: 1. **react-pdf库** ```jsx import { Document, Page } from 'react-pdf'; <Document file={blob}> <Page pageNumber={1} scale={2} /> </Document> ``` 2. **Base64预览** 将Blob转为Base64后直接嵌入: ```javascript const reader = new FileReader(); reader.onload = () => { const iframe = `<iframe src="data:application/pdf;base64,${btoa(reader.result)}"></iframe>`; document.getElementById('preview').innerHTML = iframe; }; reader.readAsBinaryString(blob); ``` ### 五、调试建议 1. 控制台输入`pdfjsLib.version`确认加载的PDF.js版本 2. 通过`navigator.userAgent`检测具体设备类型 3. 使用Safari远程调试功能排查IOS具体报错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值