Como obter um XML sem que o navegador o abra noutra página
Tenho um ficheiro xml a transferir. Como todos sabem quando eu dou o link abaixo
<a href="some.xml">Downlad XML</a>
o XML irá abrir numa página nova que o mostre. No entanto, gostaria de saber se há uma maneira, isso pode baixar como outros arquivos, como a .ficheiro zip
6 answers
Existe um cabeçalho HTTP chamado Content-Disposition, que é definido em RFC1806 como se segue:
2. 1 Tipo De Disposição Em Linha
Uma parte do corpo deve ser marcada
inline
se se pretende ser apresentado automaticamente na visualização da mensagem. As partes do corpo Inline devem ser apresentadas por ordem que ocorrem, sujeitos à semântica normal de mensagens multipartidárias.2.2 O Tipo De Disposição Do Anexo
As partes do corpo podem ser designadas
attachment
para indicar que são separado do corpo principal do mensagem de E-mail, e que a sua visualização não deve ser automática, mas subordinadas a outras medidas do utilizador. O MUA poderia em vez disso apresentar o utilizador de um mapa de bits terminal com uma representação icónica dos anexos, ou terminais de caracteres, com uma lista de anexos a partir dos quais o utilizador pode seleccionar para visualização ou armazenamento.
A fim de coloque a mensagem de cabeçalho no arquivo xml, você vai precisar do acesso ao lado do servidor. Por exemplo, usando a função PHP header , você poderia escrever algo como:
header('Content-Disposition: attachment; filename="some.xml"');
Se não tiver acesso ao lado do servidor, pode tentar o seguinte truque JavaScript que encontrei no Google (não sei se funcionaria):
<a href="javascript:void(0);" onclick="document.execCommand('SaveAs',true,'some.xml');">Save this page</a>
Tente fornecer um argumento fictício para a ligação do ficheiro como mostrado abaixo.
<a href="http://link/to/the/file.xml?dummy=dummy" download>Download Now</a>
Descobri isso ao carregar com o botão direito no navegador da web e seleccionar "gravar a página como..."faz o trabalho.
Usa algo como:
private function sendXml($xml, $label) {
ob_clean();
header('Content-type: text/plain; charset=UTF-8');
header('Content-Disposition: attachment; filename="' . $label . '.xml"');
echo ltrim($xml);
ob_flush();
exit;
}
Semelhante ao Mohd da solução acima, eu era capaz de usar a transferência de atributo, conforme especificado pela W3 aqui: http://www.w3schools.com/tags/att_a_download.asp. Um truque legal sobre ir esta rota é que você pode especificar que você deseja que o nome do arquivo a ser baixado, se for diferente do nome do arquivo no servidor.
<a href="http://link/to/the/file.xml" download="downloadedfilename.xml">XML Download Text</a>
Sub SaveXMLFromWeb()
Dim XDoc As Object
Dim XMLpath As String, outPath As String
XMLpath = "http://example.com/examplefile.xml" 'change to your URL
outPath = ThisWorkbook.Path & "\yourFileName.xml" 'change output file name
Set XDoc = CreateObject("MSXML2.DOMDocument")
With XDoc
.async = False
.validateOnParse = False
.Load (XMLpath)
.Save (outPath)
End With
MsgBox ("XML file has been downloaded and saved in the following location:" & String(2, vbLf) & outPath)
End Sub