尝试上传带有文件输入的表单,只获取输入流中的表单字段而不是File.Request方法。
表单包含一个文件输入和几个文本框,所以我不能将流上传到数据库。
我使用此方法转换为字符串
int len = Convert.ToInt32(context.Request.InputStream.Length);
byte[] stream = new byte[len];
context.Request.InputStream.Read(stream, 0, len);
string mime = Encoding.UTF8.GetString(stream);
然后在边界处拆分multipart / form-data并读取每个部分的第一行以查看它是否是文件。您可以看到完整的代码Here
文件看起来像这样
-----------------------------17901701330412
Content-Disposition: form-data; name="file"; filename="IMG00004-20101209-1704.jpg"
Content-Type: image/jpeg
�����ExifII* ����(1�2�i��Research In MotionBlackBerry 9105HHRim Exif Version1.00a2010:12:09 17:03:59 ��n�0220�v���� � ��� �2010:12:09 17:03:59��� $ &&$ #"(-:1(+6+"#2D36;=@A@'0GLF?K:?@> >)#)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>��!������ }!1AQa"q2���#B��R��$3br� %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������� w!1AQaq"2�B���� #3R�br� $4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������������������������������������������������������������������������� ?�`��ⳓ5��f)¤b��a�BS�Sb�)Xz�֝�q�"s�K�PA���}F7&��Vm��GӬ��%]� Uҵ�Z7��h�`�@&i ��i��MKB�P��r���-�B|ϛ=3Yٶ ��
并且字段看起来像这样
-----------------------------17901701330412
Content-Disposition: form-data; name="parent"
clientphotos
解析该字段很容易,并且获取图像内容很容易,但是将其保存到数据库中以便我可以将其作为图像读出来,这并不容易。
我尝试了byte[] data = Encoding.UTF8.GetBytes(rawdata);
,但输出不正确。
有没有人想过如何拍摄图像内容并将其保存到byte[]
应该是什么?
更新
第一行是从context.Request.Files[name].InputStream.Read(data, 0, fs);
第二行正在使用Encoding.UTF8.GetBytes(rawdata);
第三行正在使用Encoding.ASCII.GetBytes(rawdata);
显然第一行是正确的并且有效。
现在我只是使用第一行来获得结果,它可能会保持这种状态,除非有人可以教我如何从输入流中读取它。
更新
找到一个分享代码的好地方Source Code问题出在第49行,现在只读取Request.Files
答案 0 :(得分:3)
您不应将图像存储为文本,而是以原始二进制形式存储。如果您必须将二进制数据存储为文本,则需要使用Base64对其进行编码,但它会比它需要的更大。
http://www.vbforums.com/showthread.php?t=287324
byte[] encData_byte = new byte[data.Length];
encData_byte = System.Text.Encoding.UTF8.GetBytes(data);
string encodedData = Convert.ToBase64String(encData_byte);
return encodedData;
您还需要反过来将其恢复为可用的图像格式。一个更好的解决方案是将二进制图像存储在数据库中的blob /二进制字段类型中。
编辑:只是重读你的帖子,我看到你的数据已经在base64,只是存储而不是数据库?
再次编辑:初步问题已被编辑多次,我相信我回答了问题,但现在问题已经通过多次迭代而改变,我的初步答案现在不太适用。
答案 1 :(得分:1)
不要将内容作为字符串获取。理想情况下,您应该有一个varbinary(max)
列来存储此数据(还有一个我以前在SQL Server 2008中没有尝试过的文件存储选项)。以下是将数据读入byte[]
以存储在SQL Server中的方法:
var file = Request.Files[0];
var buffer = new byte[file.ContentLength];
using (var stream = file.InputStream)
{
var bytesRead = 0;
while (bytesRead < file.ContentLength)
{
bytesRead += stream.Read(
buffer, bytesRead, file.ContentLength - bytesRead);
}
}
就Opera而言,我对你提出的问题并不熟悉。也许你可以发布一个链接来解释你的意思“Opera必须使用FileReader
在base64上传。”如果您仍然需要处理Base64字符串,请按以下步骤将其转换为byte[]
:
using (var reader = new StreamReader(context.Request.InputStream))
{
var base64Str = reader.ReadToEnd();
var bytes = Convert.FromBase64String(base64Str);
}