Importante
O conteúdo relacionado na página abaixo foi substituído e será descontinuado em releases futuras.
A nova técnica para desenvolvimento de API poderá ser consultada através do seguinte endereço (http://tdn.totvs.com/x/6BE4Fw) e esta disponível a partir da release 12.1.22 do Logix.
Efetuando Upload de arquivos via Logix REST
O Logix REST suporta o upload de arquivos desde que o conteúdo do arquivo venha com conteúdo texto, pois atualmente o AppServer não suporta o formato multipart
. Uma boa prática de desenvolvimento é enviar o conteúdo do arquivo codificado em Base64.
Abaixo segue um exemplo de como efetuar o upload do arquivo no Logix REST via JavaScript e jQuery:
function submitform(event) { var file; var read; var data; event.preventDefault(); // Recupera o arquivo selecionado no HTML. file = $("#fileInput").prop("files")[0]; // Inicia a leitura do arquivo utilizando a API FileReader do HTML5. read = new FileReader() read.readAsBinaryString(file); read.onload = function (e) { $.ajax({ type: "POST", url: "http://localhost:4440/logixrest/imgr0001/uploadImage", headers: { "Authorization": "Basic YWRtbG9nOmFkbWxvZw==" }, data: JSON.stringify({ "image": { "fname": file.name, "fcont": btoa(read.result) // Converte em BASE64 } }) }); }; event.preventDefault(); return false; }
No exemplo acima é realizada a leitura do conteúdo do arquivo, previamente carregado em um formulário HTML, utilizando a API FileReader
do HTML5. Após o término da leitura do arquivo é realizada uma requisição AJAX para a API IMGR0001
método uploadImage
do Logix enviando o conteúdo do arquivo codificado em Base64.
No Logix, a API IMGR0001
deverá ficar conforme o exemplo abaixo:
#------------------------------------------------------------------------------# {/*Protheus.doc*/ imgr0001_pub_process_uploadImage Método para efeutar upload de imagem via Logix REST. @type function @param image, RECORD, Estrutura contendo informações da imagem. @return RECORD, Estrutura padrão de retorno do Logix REST. @example O JSON de requisição deverá ser semelhante ao abaixo: { "image": { "fname": "Nome da Imagem", "fcont": "Conteúdo da Imagem codificado em BASE64" } } /} #------------------------------------------------------------------------------# FUNCTION imgr0001_pub_process_uploadImage(image) #------------------------------------------------------------------------------# DEFINE image RECORD fname CHAR(100), fcont TEXT END RECORD DEFINE l_handle INTEGER DEFINE lr_return RECORD status SMALLINT, msg CHAR(200) END RECORD INITIALIZE lr_return.* TO NULL IF image.fname IS NULL OR image.fcont IS NULL THEN LET lr_return.status = FALSE LET lr_return.msg = "Imagem não informada." RETURN lr_return END IF LET image.fcont = LOG_decode64(image.fcont CLIPPED) # Salva a imagem no servidor. LET l_handle = LOG_FILE_create("D:\\share\\" || image.fname CLIPPED,0,0) IF l_handle < 0 THEN LET lr_return.status = FALSE LET lr_return.msg = log0030_mensagem_get_texto() RETURN lr_return END IF IF NOT LOG_FILE_write(l_handle,image.fcont CLIPPED) THEN LET lr_return.status = FALSE LET lr_return.msg = "Não foi possível carregar a imagem """|| image.fname CLIPPED ||"""." ELSE LET lr_return.status = TRUE LET lr_return.msg = "Imagem """|| image.fname CLIPPED ||""" carregada com sucesso." END IF CALL LOG_FILE_close(l_handle) RETURN lr_return END FUNCTION
Limite de tamanho de arquivo
Lembre-se que o arquivo não pode ultrapassar o limite definido no AppServer através da chave MAXSTRINGSIZE que vai de 1mb até 500mb .