首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将其转换为要存储在SQL中的图像

如何将其转换为要存储在SQL中的图像
EN

Stack Overflow用户
提问于 2011-10-07 16:59:20
回答 2查看 1.1K关注 0票数 0

尝试上载带有文件输入的表单,只从输入流获取表单字段,而不是从File.Request方法中获取表单字段。

表单包含一个文件输入和几个文本框,所以我不能将流上传到数据库。

我使用此方法转换为字符串。

代码语言:javascript
代码运行次数:0
运行
复制
    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);

然后在边界处拆分多部分/表单数据,并读取每个部分的第一行,以查看它是否是一个文件。您可以看到完整的代码这里

一个文件看起来会像这样

代码语言:javascript
代码运行次数:0
运行
复制
-----------------------------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ٶ ��

一个字段会看起来像这样

代码语言:javascript
代码运行次数:0
运行
复制
-----------------------------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);

显然,第一行是正确的和有效的。

现在,我只是使用第一行来获得结果,除非有人能教我如何从输入流中读取它,否则结果可能会保持不变。

更新

找到了一个共享代码源代码的好地方,问题是在第49行,它现在只是读取Request.Files

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-07 17:21:49

不应将图像存储为文本,而应以原始二进制形式存储。如果您必须将二进制数据存储为文本,则需要使用Base64对其进行编码,但它将比所需的要大得多。

http://www.vbforums.com/showthread.php?t=287324

代码语言:javascript
代码运行次数:0
运行
复制
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中了,只是存储在数据库中吗?

再次编辑:最初的问题已经编辑了很多次,我相信我已经回答了这个问题,但是现在这个问题已经通过多次迭代而改变了,我最初的答案现在不那么适用了。

票数 3
EN

Stack Overflow用户

发布于 2011-10-07 17:18:23

不要以字符串的形式获取内容。理想情况下,您应该有一个varbinary(max)列来存储这些数据(还有一个文件存储选项,我以前在Server 2008中没有尝试过)。下面是如何将数据读入byte[]以存储在Server中:

代码语言:javascript
代码运行次数:0
运行
复制
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必须在base64中使用FileReader上传“。如果仍然需要处理Base64字符串,下面是如何将其转换为byte[]的方法

代码语言:javascript
代码运行次数:0
运行
复制
using (var reader = new StreamReader(context.Request.InputStream))
{
    var base64Str = reader.ReadToEnd();
    var bytes = Convert.FromBase64String(base64Str);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7690457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档