Envio de documento via webservice

Olá, boa dia. Estou tentando enviar um documento via webservice, por um dataset (código 1). Tenho uma widget que fiz e funciona em uma página pública. Nesta página seleciono o documento (código 2) e depois envio para o servidor via dataset. O processo é iniciado, com o documento anexo, mas quando vou abrir o documento está vazio e corrompido. Alguém sabe dizer o que está acontecendo, o quu falta para poder enviar o documento?

Código 1


    var processAttachmentDto =  serviceManager.instantiate("com.totvs.ProcessAttachmentDto")
        log.info("processAttachmentDto init ...");
        processAttachmentDto.setDocumentId(0);
        processAttachmentDto.setVersion(1000);
        processAttachmentDto.setOriginalMovementSequence(1);
        processAttachmentDto.setColleagueId(usuarioId); 
        processAttachmentDto.setCompanyId(empresa); 
        processAttachmentDto.setDescription(descricaoDocumento);
        log.info("processAttachmentDto setDescription ..."+descricaoDocumento);
        processAttachmentDto.setFileName(nomeDocumento);
        log.info("processAttachmentDto setFileName ..."+nomeDocumento);
        processAttachmentDto.setDeleted(false); 
        processAttachmentDto.setPermission("1");
        processAttachmentDto.setNewAttach(true);
        log.info("processAttachmentDto ok ...");

        var attachment =  serviceManager.instantiate("com.totvs.Attachment");
        log.info("attachment init ...");
        attachment.setAttach(true); //Informar true para criar anexos no processo.
        log.info("attachment setAttach ...");
        attachment.setFileName(nomeDocumento); //Nome do arquivo do anexo
        log.info("attachment setFileName ..."+nomeDocumento);
        attachment.setPrincipal(false); //Anexo principal?
        log.info("attachment setPrincipal ...");

        //var byteArray= new java.lang.Byte(bytesDocumento+"");

      //  var byteArray=[bytesDocumento];

        var bytes = []; // char codes
        log.info("attachment bytesDocumento length..."+bytesDocumento.length);
        for (var i = 0; i < bytesDocumento.length; ++i) {

              log.info("attachment bytesDocumento pos..."+i);
          var code = bytesDocumento.charCodeAt(i);

          bytes = bytes.concat([code]);


        }

        log.info("attachment bytesDocumento ..."+bytes);


        attachment.setFilecontent(bytes); //Informar os bytes do anexo

        log.info("attachment ok ...");

        processAttachmentDto.getAttachments().add(attachment);



        var ProcessAttachmentDtoArray =  serviceManager.instantiate("com.totvs.ProcessAttachmentDtoArray")
        ProcessAttachmentDtoArray.getItem().add(processAttachmentDto);

    service.startProcess(usuarioIntegrador, 
                senhaIntegrador,
                empresa,
                processo,
                atividade, 
                userStringArray,
                "Comentário: Iniciando automaticamente", 
                usuarioId+"", 
                true,
                ProcessAttachmentDtoArray, 
                stringArrayArray,
                ProcessTaskAppointmentDtoArray,
                false);

Código 2


    <input 
                            id="arquivo" 
                            type="file" 
                            name="arquivo" 
                            data-url="/ecm/upload"
                            class="btn btn-primary btn-sm btn-block"
                            title="Buscar Arquivo(s)"
                            multiple/>

Pode utilizar a api /ecm/document/uploadURL para pegar o link de upload do usuario segue o exemplo desse uso.

utilizo essa API com o fileinput do styleguide


var settings = {
        action: WCMAPI.getServerURL() +"/ecm/upload",
        onComplete: function(filename, response) { 

            var json = JSON.parse(response.replace("<pre>", "").replace("</pre>", "")); 

            var dados = {"description" : json.files[0].name, "parentId" : "4989", "attachments" : [{'fileName' : json.files[0].name}]};
            $.ajax({
                  method: "POST",
                  url: WCMAPI.getServerURL() +"/api/public/ecm/document/createDocument",
                  data: JSON.stringify(dados),
                  contentType: "application/json", 
                  async: false,
                  error: function(x, e) {
                      if (x.status == 500) {
                          alert("Erro Interno do Servidor: entre em contato com o Administrador.");
                      }
                 },
                 beforeSend: function(){

                 },
                 success:function(model) {
                     $.ajax({
                          method: "GET",
                          url: WCMAPI.getServerURL() +"/api/public/ecm/document/downloadURL/"+ model.content.id,
                          contentType: "application/json", 
                          async: false,
                          error: function(x, e) {
                              if (x.status == 500) {
                                  alert("Erro Interno do Servidor: entre em contato com o Administrador.");
                              }
                         },
                         beforeSend: function(){

                         },
                         success:function(model) {
                             $("#prevCapa").attr("src", model.content).show();
                             $("#urlCapa").val(model.content);

                         }
                    });

                 }
             });

        },
        onSubmit:function(filename){}
    };
FLUIGC.utilities.uploadFileForIE('#uploadImageContato', settings);

E quando pego o link da pasta de upload eu crio o documento no GED usando essa API /api/public/ecm/document/createDocument


$.ajax({
                  method: "POST",
                  url: WCMAPI.getServerURL() +"/api/public/ecm/document/createDocument",
                  data: JSON.stringify(dados),
                  contentType: "application/json", 
                  async: false,
                  error: function(x, e) {
                      if (x.status == 500) {
                          alert("Erro Interno do Servidor: entre em contato com o Administrador.");
                      }
                 },
                 beforeSend: function(){

                 },
                 success:function(model) {
                     $.ajax({
                          method: "GET",
                          url: WCMAPI.getServerURL() +"/api/public/ecm/document/downloadURL/"+ model.content.id,
                          contentType: "application/json", 
                          async: false,
                          error: function(x, e) {
                              if (x.status == 500) {
                                  alert("Erro Interno do Servidor: entre em contato com o Administrador.");
                              }
                         },
                         beforeSend: function(){

                         },
                         success:function(model) {
                             $("#prevCapa").attr("src", model.content).show();
                             $("#urlCapa").val(model.content);

                         }
                    });

                 }
             });

nesse trecho acima e depois do documento criado, vc pode pegar o id dele e passar para um campo hidden do seu fomrmulário e anexar usando o hAPI.attachDocument( documentId ) passando o id do documento que está criado no GED.

já testou esse código com oauth?

Não realizei teste com oauth, mas realmente vc irá precisar utilizar oauth já que sua página é pública, caso precise de ajuda para utilização do oauth no fluig segue o link com a documentação Autorização para client de Serviços REST - TOTVS Fluig - TDN

testei o seu código. Está dando erro com o oauth:
JBWEB000004:The request body was too large to be cached during the authentication process
JBWEB000123: Access to the specified resource has been forbidden

Já havia tentado enviar por ajax, só que deu esse mesmo erro em outro script que tenho aqui. Por isso fui tentar envia via webservice

usei o método na api 2.0/documents/createDocument e funcionou com oauth.

você consegue ligar o arquivo ao processo?

Excelente @PEDRO , parabéns ai por ter conseguido.

Para ligar o arquivo ao processo vc pode usar o método da hAPI.attachDocument ele precisa só do id do documento criado.

Tenho uma pagina publica, e um formulário publico, que já esta com todas as rotinas , e processos, porem preciso anexar um documento no formulário publico, tem algum exemplo para melhor entendimento ? estou olhando o que você me mandou, mas quando mais exemplos melhor :slight_smile: ,deste já grato