geoserver rest 导入shape文件错误
使用rest接口导入shp文件时出错,
java.io.ioexception: current fid index is null, next must be called before write(),
网上找了一下,找到了一篇文章,地址http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%9A%84/14090.shtml
自己又仔细研究了一下出错的地方的源码,先贴一下在讲原因
org.geotools.data.shapefile.dbf.DbaseFileWriterpublic String getFieldString(int size, String s) {try {buffer.replace(0, size, emptyString);buffer.setLength(size);// international characters must be accounted for so size != length.int maxSize = size;if (s != null) {buffer.replace(0, size, s);int currentBytes =s.substring(0, Math.min(size, s.length())).getBytes(charset.name()).length;if (currentBytes > size) {char[] c = new char[1];for (int index = size - 1; currentBytes > size; index--) {c[0] = buffer.charAt(index);String string = new String(c);buffer.deleteCharAt(index);currentBytes -= string.getBytes().length;maxSize--;}} else {if (s.length() < size) {maxSize = size - (currentBytes - s.length());for (int i = s.length(); i < size; i++) {buffer.append(' ');}}}}buffer.setLength(maxSize);return buffer.toString();} catch (UnsupportedEncodingException e) {throw new RuntimeException("This error should never occurr", e);}}
以下是个人分析,可能有不对的地方,见谅:
主要原因是有中文字符引起的
dbf文件中是按字节存储的,而一个汉字,GBK是2个字节,UTF-8是三个字节,StringBuffer 里的charAt是按字符算的,geoserver rest上传文件的过程,不是直接按字节保存的,而是读取shape的全部内容,包括dbf,然后再写入到一个新的shape文件中。
如果遇到String类型的属性,会调用 getFieldString(int size,String s)方法,截取掉多余的字节,下面举一个真实的例子,size 20,s是"福建省福州市罗源县",UTF-8编码转换为字节是27,27大于字段长度20,需要截取出前20个字符来。
但是方法内部是用的从末尾删除的方法,具体看下面图片。
大家可以仔细研究一下代码,总结一下:
如果是UTF-8编码,则字段长度必须设计为value长度的3倍
如果是GBK边框,则字段长度必须设计为value长度的2倍
,否则的话如果存储的中文字段getBytes之后超过字段的length,则会报错。
java.lang.StringIndexOutOfBoundsException: String index out of range: 19
不知道修改下代码,强行把多余的字符写入到dbf文件中是否会报错,因为这个本来就是存储在dbf文件中的,但是是从其他软件中导出的,不是用geotools生成的。
如果哪位大神知道,请留言解释一下。
自己想了个解决方案
在调用rest接口之前,把dbf文件重写一遍,定义字段的时候,字段长度定义为原来的3倍,这样geoserver在遇见中文的时候就不会报错了。
贴一下简单的代码
<dependency><groupId>com.github.albfernandez</groupId><artifactId>javadbf</artifactId><version>1.9.2</version></dependency>
public static void changeStringLength(String dbfName, String dbfCharest, String ndbfName,String newCharset)throws Exception {try (DBFReader reader = new DBFReader(new FileInputStream(dbfName), Charset.forName(dbfCharest));DBFWriter writer = new DBFWriter(new FileOutputStream(ndbfName),Charset.forName(newCharset))) {int numberOfFields = reader.getFieldCount();//改变字符串字段的长度List<DBFField> fields = Lists.newArrayList();for (int i = 0; i < numberOfFields; i++) {DBFField field = reader.getField(i);//处理字段字符串字段 乘以3,为了适应UTF8是3个字节的问题if (field.getType().equals(DBFDataType.CHARACTER) || field.getType().equals(DBFDataType.VARCHAR)) {int maxLength = field.getLength() * 3;if (maxLength > field.getType().getMaxSize()) {maxLength = field.getType().getMaxSize();}field.setLength(maxLength);}fields.add(field);}//设置新文件的头writer.setFields(fields.toArray(new DBFField[fields.size()]));Object[] rowObjects;while ((rowObjects = reader.nextRecord()) != null) {writer.addRecord(rowObjects);}}}
通过以上方案暂时解决了中文字符过长的问题,但是不知道会不会触发其他的bug。
转载于:https://blog.51cto.com/luhaiyou/2357647
geoserver rest 导入shape文件错误相关推荐
- Navicat for MySQL 导入SQL文件错误
原文出自:Navicat for MySQL 导入SQL文件错误_xgbnapsua的博客-CSDN博客_navicat导入sql文件错误 !!!!一定一定要新建一个与导入文件名字相同,编码格式一致的 ...
- 导入shape文件到SDE数据库
/** * pDataSet:要导出的数据库的数据集,如果直接导入到数据库而不是数据集,则使用强制转换IWorkspace-->IDataset * strFeatFileDir:要导入的sha ...
- 导入mysql 1044_MySQL导入sql文件错误#1044
换了台新的笔记本,原来的mysql被我dump成一个sql文件,50多M.结果在新系统里面导入的时候出现问题,在命令行执行source的时候报 在我的个人知识管理中,经常用到mysql数据库,word ...
- 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件
导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件 参考文章: (1)导入数据任务(id:373985)异常, 错误信 ...
- 使用命令导入sql文件到mysql数据库时报Failed to open file错误的解决方案
使用命令导入sql文件到mysql数据库时报Failed to open file错误的解决方案 参考文章: (1)使用命令导入sql文件到mysql数据库时报Failed to open file错 ...
- 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件...
小程序导入,别人导出的数据库json文件,错误信息如下: 导入数据库失败, Error: Poll error, 导入数据任务(id:373985)异常,错误信息:解析导入文件错误,请检查导入文件内容 ...
- mysql无法打开excel_关于Navicat将Excel数据导入到MySQL中出现无法打开文件错误
一.起因:关于Navicat将Excel中的数据导入到数据库中,出现无法打开文件问题 最近想通过navicat ,将excel文件(xlsx格式)导入到数据库中,按照导入向导一步步操作,出现无法打开文 ...
- imp 00017 由于 oracle 错误 6550,imp 导入dmp文件报错 IMP-00017: 由于 ORACLE 异常 20005 求大神!...
当前位置:我的异常网» Oracle管理 » imp 导入dmp文件报错 IMP-00017: 由于 ORACLE 异常 imp 导入dmp文件报错 IMP-00017: 由于 ORACLE 异常 2 ...
- php错误1064,求助,phpmyadmin导入sql文件提示1064错误
求助,phpmyadmin导入sql文件提示1064错误 -- phpMyAdmin SQL Dump -- version 4.6.4 -- https://www. -- -- Host: 127 ...
最新文章
- 使用python抓取百度漂流瓶妹纸照片
- js中JSON.stringify用于自定义的类
- 把握不好数组边界的危害(记洛谷P1789题RE+WA的经历,Java语言描述)
- excel制作一个信息录入系统_制作Excel仓库入库单,一键完成数据录入、计算及保存操作...
- Web API路由与动作(三)
- 卸载 vista sp1
- 大海为什么是蓝色的?
- echarts:柱状图去掉网格线
- 彻底删除GitHub仓库的某个文件或文件夹及其历史记录
- 梭杆菌(Fusobacterium)——共生菌,机会菌,癌杆菌
- C# 中where关键字详解
- 创建springboot多模块项目(下)
- win7下怎么配置ODBC数据源
- 计算机一级msoffice考试操作题教程,2014年计算机一级考试MSOffice第三章考点解析 10...
- 【贵阳市公积金相关问题】
- 本以为PlusFo是个青铜,没想到竟是个王者
- 【Spring】(1)Spring概述:什么是Spring框架?为什么要用Spring框架?
- java校园一卡通管理系统
- win10便捷工具--Chrome插件推荐
- python切片-截取-逆序截取