今天遇到 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 上传附件报空指针的解决办法相关推荐

  1. hdwiki上传附件不显示bug解决办法

    hdwiki版本:5.0 创建.编辑词条时发现上传附件后,并没有显示附件,刷新网页也没有.但是后台显示文件已经上传成功.如图: 马上查看数据库: 原来是hdwiki官方给表wiki_attachmen ...

  2. 齐博php百度编辑器上传图片_齐博CMS整合百度编辑器上传附件的BUG以及解决办法...

    齐博CMS作为目前PHP类CMS中最草根的CMS,能够及时的为站长们着想,将开源的百度编辑器整合进程序,这是值得广大站长欢呼雀跃的事情.但就目前来说,齐博CMS与百度编辑器的整合还是存在一些细小的问题 ...

  3. 通达OA更改上传附件大小限制的解决办法

    php.ini     max_execution_time = 0    post_max_size     upload_max_filesize nginx.conf    client_max ...

  4. 解决uniapp小程序打包体积超过2M,提示包体积超过2M,“main packagexxx”,不给上传和预览的解决办法,绝对有效

    解决办法,原文地址: 解决uniapp小程序打包体积超过2M,提示包体积超过2M,"main packagexxx",不给上传和预览的解决办法,绝对有效!在微信小程序开发中,为了解 ...

  5. 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 ...

  6. 附件文件无法保存到服务器,可能是目录属性设置问题,请与管理员联系,Discuz不能上传过大文件的解决办法...

    烈火网(LieHuo.Net)教程今天论坛附件无法上传,进服务器去查看,后来发展所有DISCUZ论坛都无法上传附件,这个问题很严重,应该说非常之严重,上网找解决方案没有找到,去discuz论坛提问,斑 ...

  7. wordpress上传文件报错的解决方法(413 Request Entity Too Large、超过upload_max_filesize文件中定义的php.ini值)

    报错:413 Request Entity Too Large 问题nginx是限制上传大小,解决方法如下: 打开nginx配置文件 nginx.conf, 路径一般是:/etc/nginx/ngin ...

  8. Struts2文件上传超出配置大小的解决办法

    用Struts2做一个文件上传来着,本来是想写个验证方法来限制文件大小的,结果发现根本走不到我的验证方法就开始报异常了: THE REQUEST WAS REJECTED BECAUSE ITS SI ...

  9. Nginx 上传大文件超大超时解决办法

    问题:用nginx作代理服务器,上传大文件时(本人上传8M左右的文件),提示上传超时或文件过大. 浏览器调试报413 (Request Entity Too Large)错误,如下图所示 原因是ngi ...

  10. flash加载flv,本地测试正常,上传至空间则失败解决办法

    出现这种情况,大概都是由于IIS并没有.FLV的这种mime-type传输类型造成的.对于这一点Adobe给出了它的解决方案.如下: 1. 在web服务器上,找开IIS管理器. 2. 展开本地服务器名 ...

最新文章

  1. 如何设计 QQ、微信、微博、Github 等第三方账号登陆 ?(附表设计)
  2. HP 打印机驱动安装Return code:1603解决办法
  3. js改变classname 或添加classname
  4. 5G加速下的云办公时代来临?阿里云新品服务器 - 无影云桌面的服务开通与体验,本地客户端连接阿里云无影云桌面演示
  5. 一个不错的shell 脚本教程 入门级
  6. c++/cli中调用C#类库中的out参数
  7. [Swift]最强UIButton解析 | #selector()绑定点击事件
  8. linux双屏播放视频,Ubuntu Linux下双屏显示解决方案
  9. ubuntu 自动清理/tmp目录
  10. 发展数字经济面临哪些困难_解决数字音乐制作面临的最大问题之一
  11. Python机器学习:PCA与梯度上升:008使用PCA对数据进行降噪
  12. 在Windos上安装Nginx
  13. 网友在各自领域中所用到的芯片总结(转载)
  14. CSS3颜色渐变整理
  15. java 中奖,用Java实现中奖代码,持续更新
  16. Python:global的使用
  17. 【 C++ 技术】 C++ 高性能服务器网络框架设计细节
  18. 使用注解失败的原因及解决方法
  19. 如何查询linux的系统版本
  20. 2014科技十大名词——如果之前你不知道,证明你是行外人,如果你只是听说,证明你只是是爱好者

热门文章

  1. java竖线_JAVA 竖线|转义字符 | | 学步园
  2. GIS空间分析之公路选线
  3. Burp Proxy
  4. 如何下载微信视频号里的完整视频?
  5. Linux文件编程常用函数详解——read()和write()函数
  6. phpcms v9如何实现下载列表页直接调用下载地址
  7. 蓝字冲销是什么意思_会计记账,贷方红字,贷方蓝字什么意思
  8. 大前端 HTML基础
  9. 计算机网络 - 练习(三十二)
  10. 升级mac系统正在计算机,Mac升级卡死解决办法