Springでの、MultipartFileの非同期アップロード
同様の記事は多数見受けられましたが、一通り試して解決しなかったため、ご教授願います。
Spring4
Java8
WTPServer
を使用した環境での、input type="file"の非同期アップロードについてです。
一部では、「セキュリティー上の都合で、Ajaxでの送信はできない」とのコメントがありましたが、
少数派であったため、信ぴょう性にかけました。
form.submit()での送信は成功しているため、Springの設定等は省略します。
view.jsp
<input type="file" id="image_upload">
upload.js
$("#image_upload").change(function(){
var fd = new FormData();
var file = $("#thumbnail_appender").prop("files")[0];
var name = file.name;
var size = file.size;
fd.append("file", file);
fd.append("name", name);
fd.append("size", size);
$.ajax({
url: http://localhost:8080/upload,
type: "POST",
dataType: "text",
processData: false,
contentType: false,
data : fd,
success : function(data) {
alert(data);
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
if (callBack != null) {
return callBack(textStatus);
}
}
});
});
UploadController.java
@RequestMapping(value="/upload", method=RequestMethod.POST, produces="*/*")
public String thumbnailChange(@RequestParam("name") String name,
@RequestParam("size") long size,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
Collection<Part> parts = request.getParts();
Part part = parts.iterator().next();
File inputFile = (File) ReflectionUtils.select(ReflectionUtils.select(part, "fileItem"), "tempFile");
BufferedImage bufferedImage = ImageIO.read(inputFile);
String[] nameSep = name.split("\\.");
String outputFile = SAVE_DIRECTORY + name;
ImageIO.write(bufferedImage, nameSep[name.length() - 1], new File(outputFile));
return outputFile.getName();
}
UploadControllerに
@RequestParam("file") MultipartFile multipartFile
を設定すると、「そんなパラメータ来てませんよ」となります。
HttpServletRequest内にはパラメータが入っているようですが、
ダンプしても肝心のバイナリデータがありませんでした。
アプリケーションコンテキスト内に.tmpというデータで仮保存されているようで、
ApplicationPart.fileItem.tempFileにフルパスの文字列がありました。
※そのパスが指すファイルはありませんでしたので、違うテストを行っている際に作られたものだと思いますが
画像のバイナリデータおよび、メタデータをサーバーサイドで処理したいのですが、
何か設定ミスがありますでしょうか?