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

Java 如何将文件重定向到另一个spring控制器?,java,file,spring-mvc,redirect,multipart,Java,File,Spring Mvc,Redirect,Multipart,我有以下控制器方法: @RequestMapping(value = { "/member/uploadExternalImage", "/member/uploadExternalImage" }, method = RequestMethod.GET) public String handleFileUpload(@RequestParam String url, RedirectAttributes redirectAttributes ) th

我有以下控制器方法:

  @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 {
但是重定向并没有正常发生。它在验证时中断。接受的多部分文件为空

如何修复它

附笔。 我试过这个

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。我认为多部分文件为空,因为它不存在于请求中。您可以向重定向属性添加一个文件属性,但它不会绑定到MultipartFileWrapper

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

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


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

您添加了一个
文件
对象作为flash属性。因此,您将在重定向请求的模型中获得它。但是我无法想象你怎么能在一个用于上传文件的
多部分文件中得到它。IMHO您的第二个控制器应该是:

@RequestMapping(value = { "/member/createCompany/uploadImage",
            "/member/uploadImage" })
    @ResponseBody
    public ResponseEntity<String> handleFileUpload(Model model, Principal principal) throws IOException {
        File file = (File) model.getAttribute("file");
        ...
@RequestMapping(值={”/member/createCompany/uploadImage“,
“/member/uploadImage”})
@应答器
公共响应handleFileUpload(模型、主体)引发IOException{
File=(File)model.getAttribute(“文件”);
...

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

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";
在“request2”映射方法中,只需从模型映射中获取它


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

我明白了,以前文件大小等于0redirect@gstackoverflow:我已阅读,但无法理解您试图实现的目标。为什么您尝试对未上载的文件使用MultipartFile?为什么您不能直接使用file对象或(甚至更好)您在
binaryFile
中看到的内容?我已经更新了我的答案,并注意到试图包装该文件是一个错误的建议。
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";