如何从计算机或URL

时间:2017-09-16 19:43:56

标签: java json spring-mvc

我有一个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)。我相信这是因为系统仍然试图像计算机上的本地文件一样找到它。我该如何解决?

1 个答案:

答案 0 :(得分:2)

例外来自FileUtils.copyURLToFileThe JavaDoc for this method表示可能会出现以下原因:

  
      
  1. 如果无法打开源网址
  2.   
  3. 如果目的地是目录
  4.   
  5. 如果目的地无法写入
  6.   
  7. 如果目的地需要创建,但不能
  8.   
  9. 如果在复制期间发生IO错误
  10.   

我认为最有可能的两位候选人是#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
}