Bom pessoal, estou com um dilema aparentemente fácil de resolver, tenho uma aplicação que faz upload de imagem, e antes de fazer o upload estou recortando a imagem, quando eu recorto a imagem a imagem gera um canvas, eu transformo o canvas em blob com a function .toBlob()
, e depois atribuo ele a um var formData = new FormData();
, so que ai que esta problema, o meu backand que faz o upload só aceita dados vindos de um form enctype=“multipart/form-data”, ai que surgiu minha primeira ideia que e a seguinte: Eu pegar o meu blob ou o canvas e coloca-lo em um input file dentro de um form enctype=“multipart/form-data” e da um submit no form, so que eu não sei como atribuir um arquivo ao input file, alguem pode me ajudar com isso?
A questão não é vc atribuir, mas sim o navegador aceitar… campos file são controlados pelo navegador, manipular o atributo src (nesse caso para escrita) do campo em navegadores modernos pode gerar erro por eles não deixarem (questões de segurança, etc), na duvida tente…
var imagem = document.getElementById('id_do_input');
imagem.src = imagem;
Faça isso com o console de erros aberto (F12, aba console) para debugar…
Obs: não mexi ainda com blob, etc, pesquise mais a respeito para tentar implementar a forma correta…
Obs2: não seria mais prático, deixar o controle de recortar a imagem direto no servidor? Assim vc envia a imagem “crua” usa o submit simples pelo enctype etc sem problemas, o servidor recorta e salva a imagem a seu gosto?
E que eu coloquei um mecanismo onde a pessoa escolhe o que quer recortar, e delimitei o tamanho, pq se eu colocar na parte do serve o usuário não vai ter controle do que quer salvar entende?
muito obrigado brother, a dica que vc me deu ai atendeu a minha nescidade, so fiz uma modificação,
lembra do canvas que lhes falei? coloquei uma variavel pra pegar o input e atribui no input.src a url do canvas ficou assim
var formData = document.getElementById(‘input’);
formData.src = canvas.toDataURL();
vlw brother
Agora entendi, há uma regra de negócio por trás…
Funfo certin? , segue outro jeito de fazer se precisar enviar por ajax com jquery por exemplo…
var form = $("#form-cadastro");
var formData = new FormData(form[0]);
$.ajax({
url: "server.php",
type: "POST",
data: formData,
dataType: 'json',
processData: false,
contentType: false,
success: function(json) {
console.log(json);
}
});
Lembrando que seu form (form[0] nesse exemplo) precisa ter enctype tudo certinho normal, blz?
Só precisa ter cuidado com navegadores antigos… sucesso irmão!
Funcionou em partes, ta enviando, mas a api de upload não ta aceitando o tipo de data mandado pelo ajax, meu backand ta em node.js e a api e a multer, e ela so aceita form no formato bruto, vou ver na documentação da api se da pra mandar o form bruto via ajax pois queria implementar uma barra de progresso.
Questão de estudar, apenas indiquei como outra forma de implementação, boa sorte!
Vlw pela ajuda, muito obrigado pela atenção, acho que consigo daqui pra frente vlw
Conseguindo uma solução se puder posta pra gente ver, outras pessoas podem ter a mesma duvida, etc…
a solução ficou a seguinte,
// a variavel canvas e a imagem ja cortada com a api cropper.js.
var input_file = document.getElementById(‘input’);//input do tipo file dentro do form
input_file.src = canvas.toDataURL(); //nessa parte o form abaixo recebe a imagem ja cortada.
e o form com input ficou o seguinte
’<‘form action="/file" id=“form_pf” method=“post” enctype=“multipart/form-data”>
’<‘input type=“file” class=“sr-only” id=“input” name=“image” accept=“image/*”>
’<‘button type=“button” class=“btn btn-primary” type=“submit”>enviar
’<’/form>
obs(tire as apas do inicio das tag html do form)
Show!, apenas uma pequena obs:
Seu button enviar possui dois types (button e submit) é melhor definir apenas um tipo, se precisar validar seu html no futuro (https://validator.w3.org/) a validação pode acusar esse ponto, lembrando que por padrão uma tag button tem type=“submit” se não especificado…
No mais, sucesso!