Java API文件上传下载时URI构造错误引发FileNotFoundException排查
问题原因分析
1. file URI 格式不符合规范
你当前传递的FILE_LOCATION值file:/192.168.0.3/c:/testDocs/testFile.docx存在两处格式错误:
- 远程文件的file URI协议前缀格式错误:按照RFC 8089标准,访问远程主机的文件URI格式应为
file://<主机地址>/<共享名>/<文件路径>,你只写了单斜杠file:/,会被Java解析为本地路径,所以会把192.168.0.3当成本地目录的第一层,自然找不到文件。 - 路径中直接使用了远程机器的本地盘符:你不能直接在URI里写远程机器的
c:/,必须先把远程机器的c:\testDocs文件夹设置为SMB共享,拿到共享名后用共享名替代盘符部分。比如你把该文件夹共享名设为testDocs,对应URI里的路径部分就是/testDocs/testFile.docx。
2. 原生URLConnection对远程SMB共享的兼容性差
就算你修正了URI格式,如果你的API部署在Linux服务器上,系统本身不支持直接通过file协议访问Windows SMB共享,依旧会抛出文件不存在的错误。
解决方案
- 第一步:先配置远程机器(192.168.0.3)的共享设置,将
c:\testDocs设为共享文件夹,记录共享名,同时确保API所在服务器有权限访问该共享。 - 第二步:修正
FILE_LOCATION的取值,示例(假设共享名为testDocs):
如果你要用Windows默认的管理员共享C$,则取值为:{ "FILE_LOCATION":"file://192.168.0.3/testDocs/testFile.docx" }{ "FILE_LOCATION":"file://192.168.0.3/C$/testDocs/testFile.docx" } - 第三步:如果API部署在非Windows系统上,不要用原生URLConnection读取远程共享,改用JCIFS、SMBJ等专门的SMB客户端库实现文件读取。
额外提示:你当前的逻辑是API主动拉取客户端指定路径的文件,存在SSRF和本地文件读取的安全风险,上线前必须做好地址白名单校验,禁止访问内网敏感地址和服务器本地路径。
内容的提问来源于stack exchange,提问作者HLGallon
相关产品推荐
相关产品推荐

