Jump to content
belann

Upload de arquivos com javascript

Recommended Posts

Olá!

 

Estou fazendo o upload de arquivos com fetch dessa forma

fetch(url, {
        method: 'POST',
        headers: {'Content-Type': 'multipart/form-data',},
        body: formData 
    }).catch((error) => (console.log("Problemas com o Upload"), error));

 

estou usando input type=file

e criando uma const formData = new FormData(); 

mas não faz e não dá nenhum erro.

estou fazendo o upload com a url="http://localhost/dashboard/dados".

Share this post


Link to post
Share on other sites

Uma coisa que notei no seu código é a definição explícita do cabeçalho 'Content-Type' como 'multipart/form-data'. Na verdade, ao fazer uploads de arquivos usando FormData, é recomendável não definir esse cabeçalho manualmente. Isso porque o navegador precisa adicionar um boundary ao tipo de conteúdo, o que é algo que ele faz automaticamente quando você omite esse cabeçalho.

 

Aqui vai uma sugestão de como você poderia ajustar o seu código:

const formData = new FormData();
const fileField = document.querySelector('input[type="file"]');
formData.append('file', fileField.files[0]);

fetch('http://localhost/dashboard/dados', {
    method: 'POST',
    body: formData 
})
.then(response => {
    if (!response.ok) {
        throw new Error('Network response was not ok');
    }
    return response.json();
})
.then(data => {
    console.log('Success:', data);
})
.catch((error) => {
    console.error('Problemas com o Upload:', error);
});

Com essa abordagem, você deixa que o navegador cuide do cabeçalho Content-Type por você. Isso simplifica um pouco as coisas e pode resolver o problema que você está enfrentando.
 

Além disso, é sempre bom verificar se o servidor está configurado corretamente para aceitar uploads de arquivos e se o endpoint especificado está correto e pronto para lidar com solicitações POST multipart/form-data.

Se mesmo assim você continuar tendo problemas, uma boa dica é verificar os logs do servidor para mais detalhes sobre o que pode estar errado.
 

Espero que essa dica te ajude a resolver o problema! Se tiver mais alguma dúvida ou se algo não estiver claro, sinta-se à vontade para perguntar.

Boa sorte com o seu projeto!

Share this post


Link to post
Share on other sites
9 horas atrás, Williams Duarte disse:

Uma coisa que notei no seu código é a definição explícita do cabeçalho 'Content-Type' como 'multipart/form-data'. Na verdade, ao fazer uploads de arquivos usando FormData, é recomendável não definir esse cabeçalho manualmente. Isso porque o navegador precisa adicionar um boundary ao tipo de conteúdo, o que é algo que ele faz automaticamente quando você omite esse cabeçalho.

 

Aqui vai uma sugestão de como você poderia ajustar o seu código:


const formData = new FormData();
const fileField = document.querySelector('input[type="file"]');
formData.append('file', fileField.files[0]);

fetch('http://localhost/dashboard/dados', {
    method: 'POST',
    body: formData 
})
.then(response => {
    if (!response.ok) {
        throw new Error('Network response was not ok');
    }
    return response.json();
})
.then(data => {
    console.log('Success:', data);
})
.catch((error) => {
    console.error('Problemas com o Upload:', error);
});

Com essa abordagem, você deixa que o navegador cuide do cabeçalho Content-Type por você. Isso simplifica um pouco as coisas e pode resolver o problema que você está enfrentando.
 

Além disso, é sempre bom verificar se o servidor está configurado corretamente para aceitar uploads de arquivos e se o endpoint especificado está correto e pronto para lidar com solicitações POST multipart/form-data.

Se mesmo assim você continuar tendo problemas, uma boa dica é verificar os logs do servidor para mais detalhes sobre o que pode estar errado.
 

Espero que essa dica te ajude a resolver o problema! Se tiver mais alguma dúvida ou se algo não estiver claro, sinta-se à vontade para perguntar.

Boa sorte com o seu projeto!

mas se for mais de um arquivo dá para fazer um for e juntar todos do 

input[type="file"]'

Share this post


Link to post
Share on other sites

A lógica é bem parecida com a de um único arquivo, só que você vai incluir mais de um arquivo no formData.

No input no seu HTML adicione o atributo multiple

<input multiple type="file">


Agora, pegue os arquivos do input.

const fileInput = document.querySelector('input[type="file"][multiple]');

 

Adicione cada arquivo ao formData

Array.from(fileInput.files).forEach((file, index) => {
    // Aqui, 'files[]' é o nome do campo que será usado pelo servidor para receber os arquivos.
    // O uso de '[]' indica que é um array de arquivos. O nome exato depende da API do servidor.
    formData.append('files[]', file);
});


O restante é praticamente igual!

Fóruns exigem esforço próprio; não esperem soluções prontas. Pesquise para aproveitar bem.

Share this post


Link to post
Share on other sites
7 horas atrás, Williams Duarte disse:

A lógica é bem parecida com a de um único arquivo, só que você vai incluir mais de um arquivo no formData.

No input no seu HTML adicione o atributo multiple


<input multiple type="file">


Agora, pegue os arquivos do input.


const fileInput = document.querySelector('input[type="file"][multiple]');

 

Adicione cada arquivo ao formData


Array.from(fileInput.files).forEach((file, index) => {
    // Aqui, 'files[]' é o nome do campo que será usado pelo servidor para receber os arquivos.
    // O uso de '[]' indica que é um array de arquivos. O nome exato depende da API do servidor.
    formData.append('files[]', file);
});


O restante é praticamente igual!

Fóruns exigem esforço próprio; não esperem soluções prontas. Pesquise para aproveitar bem.

só está dando o seguinte erro: Problemas com o Upload: SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON não consegui achar o problema

Share this post


Link to post
Share on other sites
2 horas atrás, belann disse:

só está dando o seguinte erro: Problemas com o Upload: SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON não consegui achar o problema


O erro "Unexpected token ... sugere que o seu código esperava JSON, mas recebeu HTML, provavelmente de uma página de erro (como 404 ou 500). Isso ocorre ao tentar converter a resposta do servidor em JSON quando a URL está errada ou o servidor não responde corretamente. Verifique a URL e as configurações do servidor para garantir que aceitam uploads POST e retornam JSON.
 

fetch('http://localhost/dashboard/dados', {
    method: 'POST',
    body: formData
})
.then(response => {
    if (!response.ok) {
        throw new Error('Houve um problema com a resposta da rede');
    }
    // Verifica se a resposta é JSON antes de tentar converter
    const contentType = response.headers.get('content-type');
    if (contentType && contentType.includes('application/json')) {
        return response.json();
    } else {
        throw new Error('Não é JSON: ' + contentType);
    }
})
.then(data => {
    console.log('Sucesso:', data);
})
.catch(error => {
    console.error('Problemas com o Upload:', error);
});

 

Entenda, quando você faz o upload de arquivos para um servidor usando PHP ou Node.js, a resposta esperada geralmente depende de como você configurou o servidor para lidar com o upload e o que você precisa fazer com os arquivos após recebê-los. Abaixo estão exemplos de respostas que você pode esperar de cada um:

Exemplo de Resposta do PHP:

<?php
// Processamento do upload...
// Supondo que tudo correu bem
$response = [
    'success' => true,
    'message' => 'Upload realizado com sucesso!',
    'fileInfo' => [
        'name' => $_FILES['file']['name'],
        'size' => $_FILES['file']['size'],
        'type' => $_FILES['file']['type'],
    ]
];

header('Content-Type: application/json');
echo json_encode($response);


Exemplo de Resposta do Node.js com Express:

app.post('/upload', upload.single('file'), (req, res) => {
    // Processamento do upload...
    // Supondo que tudo correu bem
    res.json({
        success: true,
        message: 'Upload realizado com sucesso!',
        fileInfo: {
            name: req.file.originalname,
            size: req.file.size,
            type: req.file.mimetype,
        }
    });
});


Obs.: Diferentes frameworks têm a capacidade de ajustar automaticamente seus comportamentos com base nos cabeçalhos HTTP recebidos, o que significa que não existe uma única abordagem padrão aplicável a todos os casos.

Share this post


Link to post
Share on other sites
21 horas atrás, Williams Duarte disse:


O erro "Unexpected token ... sugere que o seu código esperava JSON, mas recebeu HTML, provavelmente de uma página de erro (como 404 ou 500). Isso ocorre ao tentar converter a resposta do servidor em JSON quando a URL está errada ou o servidor não responde corretamente. Verifique a URL e as configurações do servidor para garantir que aceitam uploads POST e retornam JSON.
 


fetch('http://localhost/dashboard/dados', {
    method: 'POST',
    body: formData
})
.then(response => {
    if (!response.ok) {
        throw new Error('Houve um problema com a resposta da rede');
    }
    // Verifica se a resposta é JSON antes de tentar converter
    const contentType = response.headers.get('content-type');
    if (contentType && contentType.includes('application/json')) {
        return response.json();
    } else {
        throw new Error('Não é JSON: ' + contentType);
    }
})
.then(data => {
    console.log('Sucesso:', data);
})
.catch(error => {
    console.error('Problemas com o Upload:', error);
});

 

Entenda, quando você faz o upload de arquivos para um servidor usando PHP ou Node.js, a resposta esperada geralmente depende de como você configurou o servidor para lidar com o upload e o que você precisa fazer com os arquivos após recebê-los. Abaixo estão exemplos de respostas que você pode esperar de cada um:

Exemplo de Resposta do PHP:


<?php
// Processamento do upload...
// Supondo que tudo correu bem
$response = [
    'success' => true,
    'message' => 'Upload realizado com sucesso!',
    'fileInfo' => [
        'name' => $_FILES['file']['name'],
        'size' => $_FILES['file']['size'],
        'type' => $_FILES['file']['type'],
    ]
];

header('Content-Type: application/json');
echo json_encode($response);


Exemplo de Resposta do Node.js com Express:


app.post('/upload', upload.single('file'), (req, res) => {
    // Processamento do upload...
    // Supondo que tudo correu bem
    res.json({
        success: true,
        message: 'Upload realizado com sucesso!',
        fileInfo: {
            name: req.file.originalname,
            size: req.file.size,
            type: req.file.mimetype,
        }
    });
});


Obs.: Diferentes frameworks têm a capacidade de ajustar automaticamente seus comportamentos com base nos cabeçalhos HTTP recebidos, o que significa que não existe uma única abordagem padrão aplicável a todos os casos.

Eu fiz deu essa mensagem: Upload: Error: Não é JSON: text/html;charset=UTF-8
    

Share this post


Link to post
Share on other sites
Em 17/02/2024 at 19:24, belann disse:

Eu fiz deu essa mensagem: Upload: Error: Não é JSON: text/html;charset=UTF-8
    

O problema está no retorno, não no script js, é como eu disse antes:

" resposta esperada geralmente depende de como você configurou o servidor para lidar com o upload"
 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By belann
      Olá!
       
      Estou usando o editor quill em uma página html, sem fazer a instalação com npm, mas usando as api´s via internet com http, no entanto não consigo fazer a tecla enter funcionar para mudança de linha, tentei essa configuração abaixo, mas não funcionou.
       
      modules: {       syntax: true,       toolbar: '#toolbar-container',       keyboard: {         bindings: {           enter: {             key: 13,             handler: function(range, context) {                       quill.formatLine(range.index, range.length, { 'align': '' });             }           }  
       
    • By violin101
      Caros amigos, saudações.
       
      Gostaria de poder tirar uma dúvida com os amigos.
       
      Como faço uma função para Comparar a Data Digitada pelo o Usuário com a Data Atual ?

      Data Digitada:  01/09/2024
       
      Exemplo:
      25/09/2024 é menor que DATA Atual  ====> mensagem: informe uma data válida.
      25/09/2024 é igual DATA Atual ===> o sistema libera os INPUT's.
       
      Como faço uma comparação com a Data Atual, para não Deixar Gravar Data retroativa a data Atual.
       
      Grato,
       
      Cesar
    • By Rafael Castelhano
      Olá, quero preencher um dict dinamicamente onde a chave é uma string multidimencional no dict, ex:
      var dict = {} var path = 'a.b.c' dict[path] = 55 // isso faz dict ficar desta forma {'a.b.c': 55} // mais quero que fique assim {a: {b: {c: 55}}} Como consigo alterar desta forma? 
    • By violin101
      Caros amigos, saudações.
       
      Estou com um problema de cálculo que não estou conseguindo resolver.
       
      Tenho uma rotina em Javascript que faz o seguinte cálculo qtde x vrUnit = total.
       
      qtde   x  vrUnit    =    total
      1,23   x  1,00       =    1,23    << até aqui tudo bem.
       
      o problema seria fazer o arredondamento para cima para impedir de fazer este cálculo:
      0,01 x 0,01 = 0,0001
       
      para digitar o valor estou utilizando esta função:
       
      /*Esta função quando o usuário digitar o valor aparece * 1,23 */ function formataDigitacao(i) { //Adiciona os dados para a másrcara var decimais = 2; var separador_milhar = '.'; var separador_decimal = ','; var decimais_ele = Math.pow(10, decimais); var thousand_separator = '$1'+separador_milhar; var v = i.value.replace(/\D/g,''); v = (v/decimais_ele).toFixed(decimais) + ''; var splits = v.split("."); var p_parte = splits[0].toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, thousand_separator); (typeof splits[1] === "undefined") ? i.value = p_parte : i.value = p_parte+separador_decimal+splits[1]; } /*Esta função faz a multiplicação entre Valor Unitário X Quantidade *faz a multiplicação correta */ function calcProd(){ //Obter valor digitado do produto var prod_qtde = document.getElementById("qtde").value; //Remover ponto e trocar a virgula por ponto while (prod_qtde.indexOf(".") >= 0) { prod_qtde = prod_qtde.replace(".", ""); } prod_qtde = prod_qtde.replace(",","."); //Obter valor digitado do produto var valor_unit = document.getElementById("vlrunit").value; //Remover ponto e trocar a virgula por ponto while (valor_unit.indexOf(".") >= 0) { valor_unit = valor_unit.replace(".", ""); } valor_unit = valor_unit.replace(",","."); //Calcula o Valor do Desconto if (valor_unit > 0 && prod_qtde > 0) { calc_total_produto = (parseFloat(valor_unit) * parseFloat(prod_qtde)); var numero = calc_total_produto.toFixed(2).split('.'); //<<== aqui faço o arredondamento das casas decimais de 1,234 p/ 1,23 numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.'); document.getElementById("vlrtotal").value = numero.join(','); } else { if (valor_unit > 0) { document.getElementById("vlrtotal").value = document.getElementById("vlrunit").value; } else { document.getElementById("vlrtotal").value = "0,00"; } } } Grato,
       
      Cesar
    • By violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida e não estou conseguindo resolver.
       
      Tenho um SELECT onde eu pego o ID e NOME_CAMPO, até aqui tudo bem.
       
      Para evitar erros de saída de produtos por estoque, preciso passar o ID do Centro de Custo, para gerar a Tabela de produtos em estou por cada centro de Custo.

      Exemplo:
      Centro de Custo 1 - tem:
      produto A | produto B | produto C

      Centro de Custo 2 - tem:
      produto D | produto E

      Como consigo pegar via JAVASCRIPT o código do Centro de Custo selecionado e passar para a Controller, para chamar a MODAL ?

      meu código está assim:
      VIEW
       
      <div class="col-md-6"> <label for="deptsOrigem">Dpto Origem:</label> <div class="input-group mb-3"> <input type="hidden" name="idCentrocusto" id="idCentrocusto"> <input type="text" class="form-control" id="nameCentrocusto" name="nameCentrocusto" style="font-size:15px; font-weight:bold;" placeholder="Pesquisar por Centro de Custo" disabled> <span class="input-group-btn"> <button class="btn btn-primary" type="button" id="btnOrgn" name="btnOrgn" data-toggle="modal" data-target="#modal_deptsOrigem" > <span class="fa fa-search"></span> Buscar </button> </span> </div> </div> <div class="modal fade" id="modal_deptsOrigem"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header" style="font-size:18px; color:#ffffff; background:#307192;"> <h4 class="modal-title"><strong>Lista do(s) Centro de Custo(s)</strong></h4> </div> <div class="modal-body"> <table id="deptsLista" class="table table-bordered table-hover"> <thead> <tr> <th style="text-align:center;">Código</th> <th style="text-align:center;">Centro de Custo(s)</th> <th style="text-align:center;">Ação</th> </tr> </thead> <tbody id="itensDeptos"> <!---Monta Tabela VIA Ajax---> </tbody> </table> </div> <div class="modal-footer justify-content-center" style="background:#BBAAAA;"> <button type="button" class="btn btn-danger pull-center" data-dismiss="modal">Voltar</button> </div> </div><!-- /.modal-content --> </div><!-- /.modal-dialog --> </div>  
      o JAVASCRIPT está assim:
       
      //Função para Chamar o Centro de Custo que o usuário deseja. listaDeptos(); var table = $('#deptsLista').dataTable({ "searching": true, "ordering": true, "info": true, "autoWidth": false, "pageLength": 5, "lengthMenu": [ 5, 10, 25, 50 ], "responsive": true, }); // list all employee in datatable function listaDeptos(){ $.ajax({ type : 'ajax', url : '<?=base_url()?>estoque/consumo/deptsList/', async : false, dataType : 'json', success : function(data){ var html = ''; var i; for(i=0; i<data.length; i++){ var datadpts = data[i].idDepartamento+"*"+data[i].departamento; html += '<tr>'+ '<td width="15%" style="text-align:center; font-size:16px;">'+data[i].idDepartamento+'</td>'+ '<td width="50%" style="text-align:left; font-size:16px;">'+data[i].departamento+'</td>'+ '<td width="10%" style="text-align:center;">'+ '<button type="button" class="btn btn-success btn_orgns" style="margin-right: 1%; padding: 2px 5px;" title="Selecionar Departamento" value="'+datadpts+'"><span class="fa fa-check"></span></button>'+ '</td>'+ '</tr>'; } //Fim - For $('#itensDeptos').html(html); } //Fim - success }); //Fim - ajax } //Fim - function /*---Função para Capturar o Departamento selecionado---*/ $(document).on("click",".btn_orgns",function(){ dpts = $(this).val(); infodpts = dpts.split("*"); $("#idCentrocusto").val(infodpts[0]); $("#nameCentrocusto").val(infodpts[1]); $("#modal_deptsOrigem").modal("hide"); //Função para Atualizar o Status do Botão statusPesqProd(); }); //Função para Gerar a Lista de Produtos por Centro de Custo via AJAX. listaProduts(); var table = $('#prdsLista').dataTable({ "searching": true, "ordering": true, "info": true, "autoWidth": false, "pageLength": 5, "lengthMenu": [ 5, 10, 25, 50 ], "responsive": true, }); // list all employee in datatable function listaProduts(){ $.ajax({ type : 'ajax', url : '<?=base_url()?>estoque/consumo/produtsList/', //< como passo aqui o ID do Centro de Custo Selecionado para Gerar a Lista de Produtos async : false, dataType : 'json', success : function(data){ var html = ''; var i; for(i=0; i<data.length; i++){ var prds = data[i].idProdutos+"*"+data[i].cod_interno+"*"+data[i].descricao+"*"+data[i].prd_unid+"*"+data[i].estoque_atual; html += '<tr>'+ '<td width="15%" style="text-align:center; font-size:16px;">'+data[i].cod_interno+'</td>'+ '<td width="50%" style="text-align:left; font-size:16px;">'+data[i].descricao+'</td>'+ '<td width="15%" style="text-align:center; font-size:16px;">'+data[i].prd_unid+'</td>'+ '<td width="15%" style="text-align:center; font-size:16px;">'+data[i].estoque_atual+'</td>'+ '<td width="12%" style="text-align:center;">'+ '<button type="button" class="btn btn-success btn-prod" style="margin-right: 1%; padding: 2px 5px;" title="Selecionar Produto" value="'+prds+'"><span class="fa fa-check"></span></button>'+ '</td>'+ '</tr>'; } //Fim - For $('#itensProds').html(html); } //Fim - success }); //Fim - ajax } //Fim - function  
      a CONTROLLER está assim:
      //Função para Criar Lista - Produtos Data Tables com AJAX function produtsList(){ $data = $this->consumo_model->prodsList(); echo json_encode($data); }  
       
       
      Grato,
       
      Cesar
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.