Hoje vou divulgar uma classe criada pelo grande Súlivan Simões.
Recentemente, o Súlivan (LinkedIn) me enviou uma classe e um fonte desenvolvidos por ele, para fazer a validação de arquivos no Protheus.
Assim sendo, é possível manipular e salvar arquivos no servidor do Protheus, só não vão baixar Torrents para não encher a Protheus Data rs…
Brincadeiras a parte, abaixo segue uma User Function de exemplo:
#include 'protheus.ch' #include 'parmtype.ch' #include 'totvs.ch' //Exemplo de uso da Classe xArquivo user function zAnex() local aArea := GetArea() local cDirOrig := "" local cDirDest := "\temp\" //pasta localizada dentro de Protheus_data local cNomeAnexo := "arq"+"_"+FWTimeStamp(1) local oArquivo := Nil if(pergunte("ZPERGANX",.T.)) cDirOrig := ALLTRIM(MV_PAR01) //Pergunta para pegar o arquivo na pasta. Consulta padrão DIR oArquivo:= zArquivo():New() oArquivo:addExtensoesValidas({".mp4",".jpg",".png"}) oArquivo:setDiretorioOrigem(cDirOrig) oArquivo:setNomeArquivo(cNomeAnexo) oArquivo:setDiretorioDestino(cDirDest) if( !oArquivo:isExtensaoValida() ) MsgAlert("Formato de video e/ou imagem não suportado ( "+oArquivo:getExtensaoArquivo()+" ). " +; "Formatos suportados: mp4, jpg, png") Else oArquivo:salvaArquivoServidor() oArquivo:removeArquivo(oArquivo:getDiretorioOrigem()) endif endif restArea(aArea) return
E abaixo, a classe desenvolvida:
#include 'protheus.ch' #include 'parmtype.ch' #include 'totvs.ch' #include 'msobject.ch' #include 'fileio.ch' /*/{Protheus.doc} zArquivo @description Classe salvar/deletar arquivos com qualquer extensão no remote e no servidor. @author Súlivan Símões Silva - ( Linkedin: https://br.linkedin.com/in/s%C3%BAlivan-sim%C3%B5es-38a963148 ) @version 1.0 @see Links Totvs 01 - https://tdn.totvs.com/display/tec/Encapsulamento+-+Modificador+de+Acesso 02 - https://tdn.totvs.com/pages/viewpage.action?pageId=6063065 03 - https://tdn.totvs.com/display/tec/Tipagem+de+Dados /*/ Class zArquivo Private Data cDirOrig As Character Private Data cDirDest As Character Private Data cExtensao As Character Private Data cNomeArquivo As Character Private Data lComprime As Logical Private Data lSalvou AS Logical Private Data aExtensoes AS Array //Construtor Public Method New() Constructor //Getters Private Method isSalvou() As Logical Public Method getDiretorioOrigem() As Character Public Method getDiretorioDestino() As Character Public Method getExtensaoArquivo() As Character Public Method getNomeArquivo() As Character Public Method isComprime() As Logical Public Method getExtensoesValidas() As Array //Setters Private Method setSalvou(lSalvou As Logical) As Undefinied Private Method setExtensao(cExtensao As Character) As Undefinied Public Method setDiretorioOrigem(cDirOrig As Character) As Undefinied Public Method setDiretorioDestino(cDirDest As Character) As Undefinied Public Method setNomeArquivo(cNomeArquivo As Character) As Logical Public Method setComprime(lComprime As Logical) As Undefinied Public Method addExtensoesValidas(aExtensoes As Array) As Undefinied //Outros Métodos Public Method isExtensaoValida() As Logical Public Method salvaArquivoServidor() As Logical Public Method removeArquivo(cArquivo As Character) As Logical EndClass /*/{Protheus.doc} Constructor @description Construtor da classe @author Súlivan /*/ Method New() Class zArquivo As Object ::setDiretorioOrigem("") ::setDiretorioDestino("") ::setExtensao("") ::setNomeArquivo("") ::setComprime(.T.) ::setSalvou(.F.) Return Self /*/{Protheus.doc} isSalvou @description Retorna se o arquivo já foi salvo ou não. @author Súlivan @return Logical, .T. caso já tenha sido salvo e .F. caso contrário /*/ Method isSalvou() Class zArquivo As Logical Return ::lSalvou /*/{Protheus.doc} getDiretorioOrigem @description Retorna o diretório de origem do arquivo. @author Súlivan @return Character, diretório origem. /*/ Method getDiretorioOrigem() Class zArquivo As Character Return ::cDirOrig /*/{Protheus.doc} getDiretorioDestino @description Retorna o diretório de destino do arquivo @author Súlivan @return Character, diretório destino. /*/ Method getDiretorioDestino() Class zArquivo As Character Return ::cDirDest Method getExtensaoArquivo() Class zArquivo As Character Return ::cExtensao /*/{Protheus.doc} getNomeArquivo @description Retorna o nome que o arquivo possui @author Súlivan @return Character, nome do arquivo /*/ Method getNomeArquivo() Class zArquivo As Character Return ::cNomeArquivo /*/{Protheus.doc} isComprime @description Retorna se no momento de envio do arquivo para o servidor ele deve ser comprimido antes. [Só é usado no método salvaArquivoServidor] @author Súlivan @return Logical, .T. caso seja para comprimir, .F. caso contrário /*/ Method isComprime() Class zArquivo As Logical Return ::lComprime /*/{Protheus.doc} getExtensoesValidas @description Retorna todas as extensões que são válidas (poderão ser salvas) @author Súlivan @return Array, extensões que podem ser salvas /*/ Method getExtensoesValidas() Class zArquivo As Array Return ::aExtensoes /*/{Protheus.doc} setSalvou @description Flag indicando se arquivo já foi salvo ou não. @author Súlivan @param lSalvou, .T. caso arquivo já tenha sido salvo .F. caso contrário @return Undefinied /*/ Method setSalvou(lSalvou) Class zArquivo As Undefinied ::lSalvou := lSalvou Return /*/{Protheus.doc} setExtensao @description Altera propriedade que contém a extensão do arquivo origem @author Súlivan @param Character, extensão do arquivo. @return Undefinied /*/ Method setExtensao(cExtensao) Class zArquivo As Undefinied ::cExtensao := cExtensao Return /*/{Protheus.doc} setDiretorioOrigem @description Altera propriedade que contém diretório origem @author Súlivan @param Character, diretório origem. @return Undefinied /*/ Method setDiretorioOrigem(cDirOrig) Class zArquivo As Undefinied ::cDirOrig := cDirOrig ::setExtensao(Lower(Right(Alltrim(::cDirOrig),4))) Return /*/{Protheus.doc} setDiretorioDestino @description Altera propriedade que contém diretório destino do arquivo @author Súlivan @param Character, diretório destino (incluindo o nome e extensão do arquivo). @return Undefinied /*/ Method setDiretorioDestino(cDirDest) Class zArquivo As Undefinied ::cDirDest := cDirDest Return /*/{Protheus.doc} setNomeArquivo @description Altera o nome do arquivo origem antes de ser copiado @author Súlivan @param Caractér, diretório destino (incluindo o nome e extensão do arquivo). @return Logical, .T. caso tenha conseguido alterar o nome, .F. caso contrário. /*/ Method setNomeArquivo(cNomeArquivo) Class zArquivo As Logical Local nRet := -1 Local cDirOrigem := "" Local aDirOrigem := {} Local nIndice := 0 If !(::isSalvou()) ::cNomeArquivo := cNomeArquivo aDirOrigem := StrTokArr2( ::getDiretorioOrigem(), "\") For nIndice := 1 To Len(aDirOrigem)-1 cDirOrigem += aDirOrigem[nIndice]+"\" Next cDirOrigem += ::getNomeArquivo() + ::getExtensaoArquivo() If( !Empty(Alltrim(::getNomeArquivo())) ) nRet := fRename( ::getDiretorioOrigem(), cDirOrigem ) If(nRet != -1) ::setDiretorioOrigem(cDirOrigem) Else ConOut("<zArquivo>[alteraNomeArquivo] - FError -> "+FError() ) Endif Endif Endif Return Iif(nRet == -1,.F., .T.) /*/{Protheus.doc} setComprime @description Altera propriedade que contém a propriedade que define se arquivo deve ou não ser comprmido antes de ser copiado.[Só é usado no método salvaArquivoServidor] @author Súlivan @param Logical, .T. caso deve ser comprimido .F. caso contrário @return Undefinied /*/ Method setComprime(lComprime) Class zArquivo As Undefinied ::lComprime := lComprime Return /*/{Protheus.doc} addExtensoesValidas @description Adiciona quais extensões poderão ser salvas @author Súlivan @param Array, Array contendo extensões válidas exemplo {".mp4",".pdf",".jpg"} @return Undefinied /*/ Method addExtensoesValidas(aExtensoes) Class zArquivo As Undefinied Local nIndice:=0 ::aExtensoes := Iif( ValType(::aExtensoes)=="A",::aExtensoes,{}) If( ValType(aExtensoes) == "A" ) For nIndice := 1 To Len(aExtensoes) Aadd(::aExtensoes,aExtensoes[nIndice]) Next Endif Return /*/{Protheus.doc} isExtensaoValida @description Retorna se extensão do arquivo é válida ou não. @author Súlivan @return Logical, .T. se extensão for válida, .F. caso contrário /*/ Method isExtensaoValida() Class zArquivo As Logical Local nIndice := 0 Local lValida := .F. For nIndice := 1 To Len(::getExtensoesValidas()) If(::getExtensoesValidas()[nIndice] == ::getExtensaoArquivo()) lValida := .T. exit Endif Next Return lValida /*/{Protheus.doc} salvaArquivoServidor @description Salva arquivo no diretório destino localizado no Servidor. Diretório precisa estar na raiz do Protheus_data. Exemplo \temp\ @author Súlivan @return Logical, .T. caso arquivo tenha sido salvo com sucesso, .F. caso contrário. /*/ Method salvaArquivoServidor() Class zArquivo As Logical If( !Empty(::getDiretorioOrigem()) .AND. !Empty(::getDiretorioDestino()) ) If( ::isExtensaoValida() ) ::setSalvou( CpyT2S( ::getDiretorioOrigem() ,; ::getDiretorioDestino(),; ::isComprime() ; )) Endif Endif Return ::isSalvou() /*/{Protheus.doc} removeArquivo @description Deleta arquivo no diretório @author Súlivan @param Character, diretório + nome do arquivo + extensao do arquivo a ser deletado. @return Logical, .T. caso arquivo tenha sido deletado com sucesso, .F. caso contrário. /*/ Method removeArquivo(cArquivo) Class zArquivo As Logical Local nRet := -1 Default cArquivo := "" nRet := Ferase( cArquivo ) If ( nRet == -1 ) Conout("<zArquivo>[removeArquivo] - Falha na deleção do arquivo - "+FError()) Endif Return Iif(nRet == -1, .F., .T. )
Bom pessoal, por hoje é só.
Abraços e até a próxima.