如何将文件重定向到另一个弹簧控制器?

时间:2015-08-19 08:10:20

标签: java file spring-mvc redirect multipart

我有以下控制器方法:

  @RequestMapping(value = { "/member/uploadExternalImage",
            "/member/uploadExternalImage" }, method = RequestMethod.GET)
    public String handleFileUpload(@RequestParam String url, RedirectAttributes redirectAttributes
    ) throws IOException {
        byte[] binaryFile = IOUtils.toByteArray(
                new URL(url)
                        .openStream());

        File file = File.createTempFile("tmp", ".txt", new File(System.getProperty("user.dir")));
        FileUtils.writeByteArrayToFile(file, binaryFile);
        redirectAttributes.addFlashAttribute(file);
        return "redirect:/member/uploadImage";
    }

在这里,我获得外部链接,通过此链接下载文件并将其重定向到另一个控制器:

看起来像这样:

@RequestMapping(value = { "/member/createCompany/uploadImage",
            "/member/uploadImage" })
    @ResponseBody
    public ResponseEntity<String> handleFileUpload(@Validated MultipartFileWrapper file,
            BindingResult result, Principal principal) throws IOException {

MultipartFileWrapper:

@Component
public class MultipartFileWrapper {
    @Extensions(imageFormats = {".jpg",".png",".gif",".bmp"}, videoFormats = {".mp4",".mov"})
    MultipartFile multipartFile;
    ...
}

但重定向并没有正确发生。它打破了验证。接受的multipartFile为null。

如何解决?

P.S。

我试过这个

File file = File.createTempFile("tmp", ".jpg", new File(System.getProperty("user.dir")));
        FileUtils.writeByteArrayToFile(file, binaryFile);
        FileItem fileItem = new DiskFileItem("trololo", ".jpg", false, "fileName", 1024_000_0, file);
        fileItem.getOutputStream();
        fileItem.getInputStream();
        MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
        MultipartFileWrapper wrapper = new MultipartFileWrapper();
        wrapper.setMultipartFile(multipartFile);
        redirectAttributes.addFlashAttribute(wrapper);
        return "redirect:/member/uploadImage";

它正确重定向但大小等于0

3 个答案:

答案 0 :(得分:0)

我认为multipartFile为null,因为它在请求中不存在。您将文件属性添加到重定向属性,但不会绑定到MultipartFileWrapper。

在重定向之前尝试将文件包装在CommonsMultipartFile或MockMultipartFile中。这显然是一个不好的建议,因为这不是多形式请求,也不会发生绑定。

最好的办法是直接处理文件内容,或创建一个单独的方法来处理文件内容,无论是来自外部下载还是用户上传。然后,您可以将该文件添加为flash属性,并从handleFileUpload方法重定向到此方法。

在常用方法中,您必须从模型中选取文件实例。 (如Serge Ballesta所述)

答案 1 :(得分:0)

您将File对象添加为flash属性。因此,您将在模型中获取重定向的请求。但我无法想象如何在MultipartFile中获取上传文件。恕我直言,你的第二个控制器应该是:

@RequestMapping(value = { "/member/createCompany/uploadImage",
            "/member/uploadImage" })
    @ResponseBody
    public ResponseEntity<String> handleFileUpload(Model model, Principal principal) throws IOException {
        File file = (File) model.getAttribute("file");
        ...

答案 2 :(得分:0)

如下面的代码片段所示,只需从输入流中读取文件并将其写入输出流,

final File TEST_FILE = new File("C:/Users/arrows.gif");
    final DiskFileItem diskFileItem = new DiskFileItem("file", "image/jpeg", true, TEST_FILE.getName(), 100000000, TEST_FILE.getParentFile());
    InputStream input =  new FileInputStream(TEST_FILE);
    OutputStream os = diskFileItem.getOutputStream();
    int ret = input.read();
    while ( ret != -1 )
    {
      os.write(ret);
      ret = input.read();
    }
    os.flush();

    MultipartFile multipartFile = new CommonsMultipartFile(diskFileItem);
    redirectAttributes.addFlashAttribute("multipartFile", multipartFile);

    return "redirect:request2";

在&#34; request2&#34;映射方法,只需从模型图中获取,

enter image description here

我希望它能解决这个问题。