我编写了一个ASP.NET web服务,它接受请求,从Oracle数据库收集数据,并通过JSON发回信息。该数据包括一个需要在Base64中返回的图像文件(jpg)。
一切都很顺利,直到我试图返回图像。我的代码如下:
Oracle存储过程:(转述)
create or replace PROCEDURE check_data(
<in parameters here>,
outpixblob OUT BLOB);
fileptr := utl_file.fopen('PIX_DIR', vFilename, 'rb', 32760);
utl_file.get_raw(fileptr, outpixblob);
这似乎工作得很好,因为我已经追踪了它,并看到了可预测的数据返回(base64字符串)
现在,到C#代码:
conn.Open();
var cmd = new OracleCommand
{
Connection = conn,
CommandText = "CHECK_DATA",
CommandType = CommandType.StoredProcedure,
};
//lots of parameter settings here, just showing the pertinent one
//cmd.Parameters.Add("outpixblob", OracleDbType.Blob).Direction = ParameterDirection.Output;
var dr = cmd.ExecuteNonQuery();
var blob = (OracleBlob) cmd.Parameters["outpixblob"].Value;
var buffer = new byte[blob.Length];
blob.BeginChunkWrite();
blob.Write(buffer, 0, (int)blob.Length);
blob.EndChunkWrite();
string photoString = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length);
result = new VisitorCheckResult
{
...
Photo = photoString,
};
很明显,我又删掉了非必要的代码,但我相信我正在做的事情是有想法的。
photostring的结果不是我调试Oracle存储过程时看到的值;相反,它是一个长字符串"\u0000",一次又一次。
我确信我明显遗漏了一些东西,但作为一个n00b,我看不出它是什么。
救命!
好的,找到了答案。事实证明,我使用write()方法时,错误地认为它会写入缓冲区。Write()方法将数据写入Oracle BLOB对象。我需要使用Read()方法。
一旦发生这种情况,在我将byte[]数组转换为base64:之后
result.Photo = Convert.ToBase64String(buffer);
结果很好。
感谢所有人,特别是感谢dbc,他的回应帮助我意识到发生了什么。