我有一个webapp,它接受JSON文件并将其解析为对象。我的目标是让用户能够从本地计算机或URL上传文件。
我的索引JSP页面如下所示:
<form method="post" action="products" enctype="multipart/form-data">
Select a file from the computer <input type="file" name="file">
<br>
Or load from URL<input type="url" name="urlFile">
<br>
<button type="submit">Parse</button>
控制器类看起来像这样
public String parse(@RequestParam("file") MultipartFile file,
@RequestParam("urlFile") URL url,
Model model)
throws IOException, SAXException, ParserConfigurationException
{
File convFile = null;
if(file != null)
{
convFile = new File(file.getOriginalFilename());
file.transferTo(convFile);
}
else if(url != null)
{
String tDir = System.getProperty("java.io.tmpdir");
String path = tDir + "tmp" + ".xml";
convFile = new File(path);
convFile.deleteOnExit();
FileUtils.copyURLToFile(url, convFile);
}
//... parsing JSON...
return "products"
}
当我尝试从本地计算机上传它时效果很好,但是当我尝试使用URL时,我得到500错误(java.io.FileNotFoundException
)。我相信这是因为系统仍然试图像计算机上的本地文件一样找到它。我该如何解决?
答案 0 :(得分:2)
例外来自FileUtils.copyURLToFile
。 The JavaDoc for this method表示可能会出现以下原因:
- 如果无法打开源网址
- 如果目的地是目录
- 如果目的地无法写入
- 如果目的地需要创建,但不能
- 如果在复制期间发生IO错误
醇>
我认为最有可能的两位候选人是#3和#4。您可能无权访问该目录。在FileUtils方法周围添加一个try-catch并记录问题。
String tDir = System.getProperty("java.io.tmpdir");
String path = tDir + "tmp" + ".xml";
convFile = new File(path);
convFile.deleteOnExit();
try {
FileUtils.copyURLToFile(url, convFile);
}
catch (IOException e) {
// log exception
}