Seaweed 上传附件报空指针的解决办法
今天遇到 Seaweed 的一个bug,调用 FileTemplate 的 getFileStatus(String fileId)方法报 NullPointer 。
由于之前未使用过分布式的文件服务器,看了小半天的时间,尝试了一些办法,终于找到了根本原因去解决。假设推理果然是屡试不爽啊。
那我先贴上报空指针的代码(相信大家都会直接这样用,可能也会遇到我这种问题):
1、上传附件 代码
/*** @Description: 上传附件接口* @Date: 2019/12/19*/@PostMapping("/upload")@ApiOperation(value = "上传附件接口", notes = "上传附件,上传成功返回附件id")public RestResponse<FileHandleStatus> uploadFile(@RequestParam(name = "fileId",required = false) String fileId, @RequestParam("excelFile") MultipartFile file) throws IOException {try {if (file.isEmpty()) {return RestResponse.fail().setMsg("上传文件不能为空!");}if (!StringUtils.isEmpty(fileId)){return RestResponse.ok(template.updateFileByStream(fileId,file.getOriginalFilename(),file.getInputStream()));}return RestResponse.ok(template.saveFileByStream(file.getOriginalFilename(), file.getInputStream()));} catch (Exception e) {logger.error("上传附件失败", e);return RestResponse.fail().setMsg("上传附件服务连接关闭");}}
2、获取附件详情 代码
*** 获取附件的详情* @return*/@GetMapping("/getFileInfo/{fileId}")@ApiOperation(value="公共下载附件接口",notes = "下载附件接口")@ApiImplicitParams(value = {@ApiImplicitParam(name = "fileId", value = "附件id", dataType = "String", required = true)})public RestResponse<FileHandleStatus > getFileInfo(@PathVariable String fileId) throws IOException {FileHandleStatus status = template.getFileStatus(fileId);return RestResponse.ok(status );}
解决步骤:
一、debug之后发现是由于 getFileStatus ()方法里 headerResponse 里无 Content-Type 这个头部信息,导致 new FileHandleStatus 的时候报空指针
public FileHandleStatus getFileStatus(String fileId) throws IOException {String targetUrl = this.getTargetUrl(fileId);HeaderResponse headerResponse = this.volumeWrapper.getFileStatusHeader(targetUrl, fileId);try {return new FileHandleStatus(fileId, headerDateFormat.parse(headerResponse.getLastHeader("Last-Modified").getValue()).getTime(), headerResponse.getLastHeader("Content-Disposition").getValue().substring(10, headerResponse.getLastHeader("Content-Disposition").getValue().length() - 1), headerResponse.getLastHeader("Content-Type").getValue(), Long.parseLong(headerResponse.getLastHeader("Content-Length").getValue()));} catch (ParseException var5) {throw new SeaweedfsException("Could not parse last modified time [" + headerResponse.getLastHeader("Last-Modified").getValue() + "] to long value");}}
二、此时,推想下,可能是因为上传文件的时候未保存 Content-Type 导致的。那我们就去看下 saveFileByStream 上传文件这个方法,看到有重载方法
public FileHandleStatus saveFileByStream(String fileName, InputStream stream) throws IOException {return this.saveFileByStream(fileName, stream, ContentType.DEFAULT_BINARY);}public FileHandleStatus saveFileByStream(String fileName, InputStream stream, ContentType contentType) throws IOException {AssignFileKeyResult assignFileKeyResult = this.masterWrapper.assignFileKey(this.assignFileKeyParams);String uploadUrl;if (this.usingPublicUrl) {uploadUrl = assignFileKeyResult.getPublicUrl();} else {uploadUrl = assignFileKeyResult.getUrl();}return new FileHandleStatus(assignFileKeyResult.getFid(), this.volumeWrapper.uploadFile(uploadUrl, assignFileKeyResult.getFid(), fileName, stream, this.timeToLive, contentType), uploadUrl);}
三、于是就试了一下用重载的 saveFileByStream 方法(设置contentType的信息),那再看下 ContentType 这个类,是 final 修饰的,而且用的是 DEFAULT_BINARY,此时我们试下给 contenType重新赋值,传进去。修改 saveFileByStream 方法如下:
/*** @Description: 上传附件接口* @Author: ma.kangkang* @Date: 2019/12/19*/@PostMapping("/upload")@ApiOperation(value = "上传附件接口", notes = "上传附件,上传成功返回附件id")public RestResponse<FileHandleStatus> uploadFile(@RequestParam(name = "fileId",required = false) String fileId, @RequestParam("excelFile") MultipartFile file) throws IOException {try {if (file.isEmpty()) {return RestResponse.fail().setMsg("上传文件不能为空!");}if (!StringUtils.isEmpty(fileId)){return RestResponse.ok(template.updateFileByStream(fileId,file.getOriginalFilename(),file.getInputStream()));}// 新增contentType设置传参ContentType contentType = ContentType.create("application/x-www-form-urlencoded", Consts.ISO_8859_1);return RestResponse.ok(template.saveFileByStream(file.getOriginalFilename(), file.getInputStream(),contentType));} catch (Exception e) {logger.error("上传附件失败", e);return RestResponse.fail().setMsg("上传附件服务连接关闭");}}
四、修改完重启项目,再去看下下载附件接口,发现不报空指针了,但是返回的文件名乱码,而且未返回文件url,那我们修改下载接口如下(1、解决文件名乱码,2、返回文件url):
/*** 获取附件的详情* @return*/@GetMapping("/getFileInfo/{fileId}")@ApiOperation(value="公共下载附件接口",notes = "下载附件接口")@ApiImplicitParams(value = {@ApiImplicitParam(name = "fileId", value = "附件id", dataType = "String", required = true)})public RestResponse<SeaweedResponse> getFileInfo(@PathVariable String fileId) throws IOException {FileHandleStatus status = template.getFileStatus(fileId);// 解决文件名乱码String name = new String(status.getFileName().substring(8,status.getFileName().length()-1).getBytes("iso-8859-1"),"utf-8");SeaweedResponse response = new SeaweedResponse();if (status != null){response.setFileId(status.getFileId());response.setFileName(name);// 重新根据文件id 获取文件的 urlresponse.setFilePath(template.getFileUrl(fileId));}return RestResponse.ok(response);}
问题完美解决,搞了半天终于把问题解决,喝杯咖啡冷静下。
我是进阶的球儿,大家一起2019年的爬坑历程。感觉分享很给力的话给个赞,谢谢!!!有问题也可以下方留言或者加本人QQ:313989006 进行沟通。
Seaweed 上传附件报空指针的解决办法相关推荐
- hdwiki上传附件不显示bug解决办法
hdwiki版本:5.0 创建.编辑词条时发现上传附件后,并没有显示附件,刷新网页也没有.但是后台显示文件已经上传成功.如图: 马上查看数据库: 原来是hdwiki官方给表wiki_attachmen ...
- 齐博php百度编辑器上传图片_齐博CMS整合百度编辑器上传附件的BUG以及解决办法...
齐博CMS作为目前PHP类CMS中最草根的CMS,能够及时的为站长们着想,将开源的百度编辑器整合进程序,这是值得广大站长欢呼雀跃的事情.但就目前来说,齐博CMS与百度编辑器的整合还是存在一些细小的问题 ...
- 通达OA更改上传附件大小限制的解决办法
php.ini max_execution_time = 0 post_max_size upload_max_filesize nginx.conf client_max ...
- 解决uniapp小程序打包体积超过2M,提示包体积超过2M,“main packagexxx”,不给上传和预览的解决办法,绝对有效
解决办法,原文地址: 解决uniapp小程序打包体积超过2M,提示包体积超过2M,"main packagexxx",不给上传和预览的解决办法,绝对有效!在微信小程序开发中,为了解 ...
- Django 上传附件报The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS错误
1.今天,上传附件的时候报了个错误: The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS ...
- 附件文件无法保存到服务器,可能是目录属性设置问题,请与管理员联系,Discuz不能上传过大文件的解决办法...
烈火网(LieHuo.Net)教程今天论坛附件无法上传,进服务器去查看,后来发展所有DISCUZ论坛都无法上传附件,这个问题很严重,应该说非常之严重,上网找解决方案没有找到,去discuz论坛提问,斑 ...
- wordpress上传文件报错的解决方法(413 Request Entity Too Large、超过upload_max_filesize文件中定义的php.ini值)
报错:413 Request Entity Too Large 问题nginx是限制上传大小,解决方法如下: 打开nginx配置文件 nginx.conf, 路径一般是:/etc/nginx/ngin ...
- Struts2文件上传超出配置大小的解决办法
用Struts2做一个文件上传来着,本来是想写个验证方法来限制文件大小的,结果发现根本走不到我的验证方法就开始报异常了: THE REQUEST WAS REJECTED BECAUSE ITS SI ...
- Nginx 上传大文件超大超时解决办法
问题:用nginx作代理服务器,上传大文件时(本人上传8M左右的文件),提示上传超时或文件过大. 浏览器调试报413 (Request Entity Too Large)错误,如下图所示 原因是ngi ...
- flash加载flv,本地测试正常,上传至空间则失败解决办法
出现这种情况,大概都是由于IIS并没有.FLV的这种mime-type传输类型造成的.对于这一点Adobe给出了它的解决方案.如下: 1. 在web服务器上,找开IIS管理器. 2. 展开本地服务器名 ...
最新文章
- 如何设计 QQ、微信、微博、Github 等第三方账号登陆 ?(附表设计)
- HP 打印机驱动安装Return code:1603解决办法
- js改变classname 或添加classname
- 5G加速下的云办公时代来临?阿里云新品服务器 - 无影云桌面的服务开通与体验,本地客户端连接阿里云无影云桌面演示
- 一个不错的shell 脚本教程 入门级
- c++/cli中调用C#类库中的out参数
- [Swift]最强UIButton解析 | #selector()绑定点击事件
- linux双屏播放视频,Ubuntu Linux下双屏显示解决方案
- ubuntu 自动清理/tmp目录
- 发展数字经济面临哪些困难_解决数字音乐制作面临的最大问题之一
- Python机器学习:PCA与梯度上升:008使用PCA对数据进行降噪
- 在Windos上安装Nginx
- 网友在各自领域中所用到的芯片总结(转载)
- CSS3颜色渐变整理
- java 中奖,用Java实现中奖代码,持续更新
- Python:global的使用
- 【 C++ 技术】 C++ 高性能服务器网络框架设计细节
- 使用注解失败的原因及解决方法
- 如何查询linux的系统版本
- 2014科技十大名词——如果之前你不知道,证明你是行外人,如果你只是听说,证明你只是是爱好者