我有以下控制器方法:
@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。
如何解决?
我试过这个
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
答案 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;映射方法,只需从模型图中获取,
我希望它能解决这个问题。