Spring Boot
で大きいサイズのファイルをアップロードします。
アップロードの仕方はググればなんとなく出てくるので、下記のソースは特に説明しません。
SweetAlert
は何かリッチなダイアログですが、コードがブロッキングされない、モーダルにしても状況によっては裏が触れる等、多少注意が必要です。
SweetAlert
で使用しているdialog
要素や、multipart/form-data
はHTML5
の機能になりますので、HTML5
対応のブラウザが前提です。
あ、あとjQuery
にも依存してます。
upload.html
<form id="upload_file" enctype="multipart/form-data">
<div id="search-upload">
<input id="file-select" type="file" name="file" />
<span id="upload" class="button button01 btn" onclick="return false;">アップロード</span>
</div>
</form>
<script>
// 「アップロード」ボタン押下
$(document).on('click', '#upload', function() {
// 確認メッセージ
swal({
title : "",
text : "ファイルをアップロードしてよろしいですか?",
type : "warning",
allowOutsideClick : "true",
showCancelButton : "true",
cancelButtonText : "閉じる"
}, function() {
formData = new FormData($('#upload_file').get()[0]);
formData.append("param1", $("#param1").val());
// アップロード要求
$.ajax({
url: "/upload",
method: 'post',
data: formData,
processData: false,
contentType: false,
cache: false,
timeout: 300000,
// アップロード成功
success: function (Result) {
// 成功時の処理
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
// エラー時の処理
}
})
});
});
</script>
UploadController.java
// ファイルアップロード
@RequestMapping(value="/upload", method=RequestMethod.POST, consumes = "multipart/form-data")
public String upload(@RequestParam("file") MultipartFile file,
@RequestParam("param1") String param1) {
return "SUCCESS";
}
さて、問題はファイルサイズが大きくてファイルがアップロードできないことでした。
ググるとapplication.properties
(もしくはapplication.yml
)でサイズ制限を解除しろと散々出てくるし、公式でもそのやり方が出てくるのですが、設定しても一向にアップロード出来ません。
application.properties
multipart.max-file-size=100MB
multipart.max-request-size=100MB
application.yml
multipart:
maxFileSize: 100MB
maxRequestSize: 100MB
色々試した結果、以下のConfiguration
クラスを作ることで解決しました。
MultiPartConfigure.java
import javax.servlet.MultipartConfigElement;
import org.springframework.boot.context.embedded.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MultiPartConfigure {
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("100MB");
factory.setMaxRequestSize("100MB");
return factory.createMultipartConfig();
}
}
結局プロパティファイルでなぜ駄目だったかはわからず。。