Restituire contenuto di un documento in binario Bas64

lunedì 23 giugno 2008 - 09.56

paquito_ita Profilo | Senior Member

Ciao,

dalle specifiche per un web service mi viene richiesto di restituire il contenuto di un documento (che risede sul DB dell'azienda) in formato binario base64, ricevendo come parametro di ingresso il relativo ID.

Al momento uso il seguente codice, che restituisce una stringa base64.
Volevo chiedervi se il procedimento fosse corretto e se restituire una stringa fosse conforme alle specifiche (anzichè restituire array di byte base64).

Grazie in anticipo

static public string ToBase64( byte[] data ) { int length = data == null ? 0 : data.Length; if (length == 0) return String.Empty; int padding = length % 3; if (padding > 0) padding = 3 - padding; int blocks = (length - 1) / 3 + 1; char[] s = new char[blocks * 4]; for (int i = 0; i < blocks; i++) { bool finalBlock = i == blocks - 1; bool pad2 = false; bool pad1 = false; if (finalBlock) { pad2 = padding == 2; pad1 = padding > 0; } int index = i * 3; byte b1 = data[index]; byte b2 = pad2 ? (byte)0 : data[index + 1]; byte b3 = pad1 ? (byte)0 : data[index + 2]; byte temp1 = (byte)((b1 & 0xFC) >> 2); byte temp = (byte)((b1 & 0x03) << 4); byte temp2 = (byte)((b2 & 0xF0) >> 4); temp2 += temp; temp = (byte)((b2 & 0x0F) << 2); byte temp3 = (byte)((b3 & 0xC0) >> 6); temp3 += temp; byte temp4 = (byte)(b3 & 0x3F); index = i * 4; s[index] = SixBitToChar( temp1 ); s[index+1] = SixBitToChar( temp2 ); s[index+2] = pad2 ? "=" : SixBitToChar( temp3 ); s[index+3] = pad1 ? "=" : SixBitToChar( temp4 ); } return new string( s ); } static private char SixBitToChar( byte b ) { char c; if (b < 26) { c = (char)((int)b + (int)'A'); } else if (b < 52) { c = (char)((int)b - 26 + (int)'a'); } else if (b < 62) { c = (char)((int)b - 52 + (int)'0'); } else if (b == 62) { c = s_CharPlusSign; } else { c = s_CharSlash; } return c; } static private char s_CharPlusSign = '+'; static private char s_CharSlash = '/'; static public char CharPlusSign { get { return s_CharPlusSign; } set { s_CharPlusSign = value; } } static public char CharSlash { get { return s_CharSlash; } set { s_CharSlash = value; } }

rossimarko Profilo | Guru

>Ciao,
>
>dalle specifiche per un web service mi viene richiesto di restituire
>il contenuto di un documento (che risede sul DB dell'azienda)
>in formato binario base64, ricevendo come parametro di ingresso
>il relativo ID.
>
>Al momento uso il seguente codice, che restituisce una stringa
>base64.
>Volevo chiedervi se il procedimento fosse corretto e se restituire
>una stringa fosse conforme alle specifiche (anzichè restituire
>array di byte base64).
>

Ciao,

Per chiarire cosa sia meglio usare dovresti darci qualche informazione in più. Stai creando un webmethod di un webservice?

A prescindere da questo, se devi effettuare una conversione da array di byte a stringa di consiglio di usare i metodi che ti mette a disposizione il framework:
- Convert.ToBase64String: http://msdn.microsoft.com/en-us/library/dhx0d524.aspx
- Convert.ToBase64CharArray: http://msdn.microsoft.com/en-us/library/system.convert.tobase64chararray.aspx

Se stai creando un webmethod valuta che hai anche un'altra possibilità, ovvero ritornare direttamente un byte array, perchè è il framework stesso che si occupa di trasmettere l'array di byte codificandolo opportunamente
[WebMethod] public byte[] GetFile(int ID) { //.. }

Se guardi la documentazione nella pagina di test del tuo webservice vedrai che il flusso di ritorno SOAP è così documentato:
<GetFileResponse xmlns="http://tempuri.org/">
<GetFileResult>base64Binary</GetFileResult>
</GetFileResponse>

Tutto dipende dalle specifiche che ti hanno dato. Considera che se dal tuo webmethod ritorni un'array di byte anche le eventuali web reference che verranno create esporranno un metodo che ritorna un'array di byte.
Se invece ritorni una stringa con la codifica base64 allora il client che chiama il tuo metodo vedrà una stringa e dovrà occuparsi della conversione da stringa base 64 ad array di byte.

Specifiche Base64: http://it.wikipedia.org/wiki/Base64
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

paquito_ita Profilo | Senior Member

Ciao Marco,

>Per chiarire cosa sia meglio usare dovresti darci qualche informazione
>in più. Stai creando un webmethod di un webservice?

Sì, devo realizzare un web service che espone un metodo [b]getDocumentContent(int docID)[/b]

>Se stai creando un webmethod valuta che hai anche un'altra possibilità,
>ovvero ritornare direttamente un byte array, perchè è il framework
>stesso che si occupa di trasmettere l'array di byte codificandolo
>opportunamente
>Tutto dipende dalle specifiche che ti hanno dato. Considera che
>se dal tuo webmethod ritorni un'array di byte anche le eventuali
>web reference che verranno create esporranno un metodo che ritorna
>un'array di byte.
>Se invece ritorni una stringa con la codifica base64 allora il
>client che chiama il tuo metodo vedrà una stringa e dovrà occuparsi
>della conversione da stringa base 64 ad array di byte.

Nel mio caso sarebbe (penso) molto piu' preciso ritornare un array di byte. Le specifiche dicono circa il valore di ritorno: "Binary Data as Bas64". Penso quindi sia meglio ritornare l'array di byte.
Per fare ciò quindi, considerando un web method, qual è il migliore approccio? Mi pare sia più semplice ritornare direttamente il file come array di byte. In tal caso devo solo accedere al file e ritornarlo come array di byte? Mi potresti postare due righe di codice circa il procedimento?

Grazie mille!!!

rossimarko Profilo | Guru

Ecco un piccolo esempio:

[WebMethod] public byte[] GetFile(int ID) { string filePath = ""; if (System.IO.File.Exists(filePath)) { return System.IO.File.ReadAllBytes(filePath); } else { //Inserire una gestione di errore oppure ritornare un array vuoto } }

Ovviamente il path del file lo devi ricavare dall'id che ti viene passato.
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5