Ainda não está funcionando, eu precisei salvar o arquivo .xml em disco e pedir para os usuários compactarem e enviarem pelo site, adivinha se já não estão reclamando... ehueheuheuhe
Estou usando o seguinte método para compactar:
function TSngpc2Gerenciador.GetXmlCompressedInZipFileFromString(pString: string): string;
var
vXmlDocument: TStrings;
vFileName: string;
vInFile,
vTmpFile: TFileStream;
vCompr: TCompressionStream;
vL: Integer;
begin
//Salva o arquivo
vFileName := FormatDateTime('yyyymmddhhnnsszzz', Now);
vXmlDocument := TStringList.Create;
vXmlDocument.Text := StringReplace(StringReplace(pString, #10, '', [rfReplaceAll]), #10, '', [rfReplaceAll]);
vXmlDocument.SaveToFile(ExtractFilePath(ParamStr(0)) + '\' + vFileName + '.xml');
//Compacta o arquivo
vInFile := TFileStream.Create(ExtractFilePath(ParamStr(0)) + '\' + vFileName + '.xml', fmOpenRead);
vTmpFile := TFileStream.Create(ExtractFilePath(ParamStr(0)) + '\' + vFileName + '.zip', fmCreate);
vCompr := TCompressionStream.Create(clDefault, vTmpFile);
vL := vInFile.Size;
try
vCompr.CopyFrom(vInFile, vL); // Efetua a compressão do arquivo
finally
vInFile.Free;
vCompr.Free;
vTmpFile.Free;
vXmlDocument.Free;
end;
//Remove o XML antigo
DeleteFile(ExtractFilePath(ParamStr(0)) + '\' + vFileName + '.xml');
//Atribui o valor de retorno
Result := ExtractFilePath(ParamStr(0)) + '\' + vFileName + '.zip';
end;
Este método retorna o nome do arquivo que irei converter para TByteDynArray com o método abaixo:
function TSngpc2Gerenciador.FileToByteArray(const pFileName: string): TByteDynArray;
const
BLOCK_SIZE = 1024;
var
vBytesRead, vBytesToWrite, vCount: integer;
vF: file of Byte;
vTemp: Pointer;
begin
AssignFile(vF, pFileName);
Reset(vF);
try
vCount := FileSize(vF);
SetLength(Result, vCount);
vTemp := @Result[0];
vBytesRead := BLOCK_SIZE;
while (vBytesRead = BLOCK_SIZE) do
begin
vBytesToWrite := Min(vCount, BLOCK_SIZE);
BlockRead(vF, vTemp^, vBytesToWrite, vBytesRead);
vTemp := Pointer(LongInt(vTemp) + BLOCK_SIZE);
vCount := vCount - vBytesRead;
end;
finally
CloseFile(vF);
//Exclui o arquivo antigo
DeleteFile(pFileName);
end;
end;
E na hora da chamada ao web service:
Result := WsTeste.EnviaArquivoSNGPC(pEmail, pSenha, FileToByteArray(GetXmlCompressedInZipFileFromString(pArquivo)), pHash);
dá aquele erro de caracteres inválidos na mensagem.