Olá a todos, estou com um problema ao realizar um upload com ajax. Acredito que o problema ocorre quando envio arquivos com tamanho maior que o padrão permitido pelo Vraptor. Pra mim não é solução aumentar o tamanho do arquivo de upload com @UploadSizeLimit ou extendendo a classe DefaultMultipartConfig pois para o meu negócio faz muito sentido que o tamanho da imaagem seja pequena. Pelo que li o Vrptor deveria lançar um erro de validação quando o tamanho do arquivo excedesse o valor máximo permitido, mas isso não está acontecendo, o arquivo simplesmente chega nulo no controller. Como posso solucionar isso?
segue meu código
<form id="form" method="post" action="<c:url value="/destaques"/>">
<div class="row">
<div class="col-md-12 form-group bw-required">
<label class="control-label">Banner</label> <input type="hidden"
id="banner" name="destaque.banner" value="${destaque.banner}" />
<input type="hidden" id="novobanner" name="destaque.novoBanner" value="${destaque.novoBanner}" />
<div class="js-container-banner-destaque">
<div id="upload-drop" class="bw-upload">
<i class="glyphicon glyphicon-cloud-upload"></i> <span>Arraste
a foto aqui ou</span> <a class="bw-upload-form-file">selecione<input
id="upload-select" type="file" accept=".jpg,.jpeg,.png" /></a>
</div>
</div>
</div>
</div>
</form>
<script type="text/javascript">
$(function() {
var settings = {
type : 'json',
filelimit : 1,
allow : '*(jpg|jpeg|png)',
action : '<c:url value="/fotos"/>',
complete : function(resposta) {
completeUpload(resposta);
}
};
UIkit.uploadSelect($("#upload-select"), settings);
UIkit.uploadDrop($("#upload-drop"), settings);
var arquivo = $("#banner").val();
$("#novobanner").val('');
var preenchido = Boolean(arquivo);
if (preenchido) {
renderizarFoto($("#banner").val());
}
function completeUpload(resposta) {
$("#novobanner").val('true');
renderizarFoto(resposta);
}
function renderizarFoto(resposta) {
$("#banner").val(resposta);
var source = $("#banner-destaque").html();
var template = Handlebars.compile(source);
var foto = '';
if ($("#novobanner").val() == 'true') {
foto = 'temp/';
}
foto += resposta;
var html = template({
foto : foto
});
var containerBannerDestaque = $('.js-container-banner-destaque');
$("#upload-drop").addClass('hidden');
containerBannerDestaque.append(html);
$(".js-remove-foto").on('click', function() {
$("#foto").val('');
$("#upload-drop").removeClass('hidden');
$(".js-banner-destaque").remove();
$("#novobanner").val('false');
});
}
</script>
<script id="logo-estabelecimento" type="text/x-handlebars-template">
<div class="row js-logo-estabelecimento">
<div class="col-md-4"></div>
<div class="col-md-4 text-center">
<a href="#" class="thumbnail"> <img
src="<c:url value="/fotos/{{logo}}"/>">
</a>
<button type="button" class="btn btn-link">
<span class="glyphicon glyphicon-remove js-remove-logo"></span>
</button>
</div>
</div>
</script>
utilizo o UIkit para fazer o upload. Com imagens menores que 2MB tudo funciona normal,mas quando excedo esse limite, o arquivo simplesmente chega nulo, sem disparar nenhum erro:
@Controller
public class FotoController {
private Result result;
private FotoStorage fotoStorage;
@Deprecated
public FotoController() {
this(null,null);
}
@Inject
public FotoController(Result result,FotoStorage fotoStorage) {
this.result = result;
this.fotoStorage = fotoStorage;
}
@Post("/fotos")
public void uploadFile(UploadedFile files){
if(files == null){
System.out.println("sou nulo");
}
String nomeFoto = fotoStorage.salvarTemporariamente(files);
result.use(Results.json()).withoutRoot().from(nomeFoto).serialize();
}
@Get("/fotos/temp/{nome}")
public byte[] recuperarFotoTemporaria(String nome){
return fotoStorage.recuperarFotoTemporaria(nome);
}
@Get("/fotos/{nome}")
public byte[] recuperar(String nome){
return fotoStorage.recuperar(nome);
}
}