

同様の記事は多数見受けられましたが、一通り試して解決しなかったため、ご教授願います。

Spring4  
Java8  
WTPServer

を使用した環境での、input type="file"の非同期アップロードについてです。

一部では、「セキュリティー上の都合で、Ajaxでの送信はできない」とのコメントがありましたが、  
少数派であったため、信ぴょう性にかけました。  
form.submit()での送信は成功しているため、Springの設定等は省略します。

view.jsp

[code]

    <input type="file" id="image_upload">
    
[/code]

upload.js

[code]

    $("#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);
                }
            }
        });
    });
    
[/code]

UploadController.java

[code]

    @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();
    }
    
[/code]

UploadControllerに

[code]

    @RequestParam("file") MultipartFile multipartFile
    
[/code]

を設定すると、「そんなパラメータ来てませんよ」となります。  
HttpServletRequest内にはパラメータが入っているようですが、  
ダンプしても肝心のバイナリデータがありませんでした。  
アプリケーションコンテキスト内に.tmpというデータで仮保存されているようで、  
ApplicationPart.fileItem.tempFileにフルパスの文字列がありました。  
※そのパスが指すファイルはありませんでしたので、違うテストを行っている際に作られたものだと思いますが

画像のバイナリデータおよび、メタデータをサーバーサイドで処理したいのですが、  
何か設定ミスがありますでしょうか？


CC BY-SA 3.0
2016-01-18T12:56:21.737
21039
2016-09-27T13:54:44.747
8396
question
jquery ajax spring java8 mvc
Springでの、MultipartFileの非同期アップロード


質問に記載した実装では、ファイルのヘッダ情報のようなものは受信可能でしたが、バイナリデータ自体は送信されていませんでした。

コントローラ

[code]

    @Controller
    @MultipartConfig(fileSizeThreshold=1024 * 1024, maxFileSize=10 * 1024 * 1024, maxRequestSize=10 * 1024 * 1024)
    public class maintnanceController extends CommonsExceptionHandler {
    
[/code]

とすることで、受信することができました。


CC BY-SA 3.0
2016-02-26T16:43:13.247
22576
2016-02-26T16:43:13.247
8396
21039
answer