如何把网上的图片存储到数据库

laolaixuebiancheng 2017-09-20 11:57:40
我这边想要做到的是:搜索网络上的图片,找到其网址,转成数据流,存入数据库,我找了很多资料,才做成这样,能基本达到目的,但现在我有两个问题,由于我注释掉的那两句不知道什么原因不能成功转成有效的数据流,我只能把图片转存成文件之后再读取之后存储到数据库,这个很多余,如果我使用同样的文件名存储呢,那将造成一个扇区被反复多次擦写,磁盘寿命会有问题,那么第一个问题就是,我怎样将这个文件存储到虚拟盘中,意思就是在内存中,最简单的做法,还是搞定这个数据流(就是我注释掉的那一部分),让他可以直接调用,不需存储。第二个问题是,我感觉这个代码非常繁琐,请大家帮我看看怎么精简,这个是在ashx里面的代码
public int tp_cunchu(string tp_path, string sql, SqlConnection conn, HttpContext context) //存图片文件
{
Bitmap img = null;
HttpWebRequest req;
HttpWebResponse res = null;
//byte[] photo = null;
string path = "";
try
{
Uri httpUrl = new Uri(tp_path);
req = (HttpWebRequest)(WebRequest.Create(httpUrl));
req.Timeout = 10000;
//设置超时值
req.UserAgent = "XXXXX";
req.Accept = "XXXXXX";
req.Method = "GET";
res = (HttpWebResponse)(req.GetResponse());
img = new Bitmap(res.GetResponseStream());
//获取图片流
path = @"E:/tupian/" + DateTime.Now.ToFileTime().ToString() + ".jpg";
//随机名
img.Save(path);
context.Response.Write("wangzhi:" + tp_path + "\n");
//MemoryStream ms = new MemoryStream();
//photo = ms.ToArray();//.GetBuffer();
}
catch (Exception ex)
{
string aa = ex.Message;
}
finally
{
//res.Close();//哦,还有,为什么我的这个关闭会报错
}
int d = 0;
string str = "";
if (path != "")
{
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] photo = br.ReadBytes((int)fs.Length);
br.Close();
fs.Close();
try
{
conn.Open();
SqlCommand com = new SqlCommand(sql, conn);
com.Parameters.Add("@photoBinary", SqlDbType.Binary, photo.Length);
com.Parameters["@photoBinary"].Value = photo;
//SqlDataReader dr= com.ExecuteReader();
d = Convert.ToInt32(com.ExecuteScalar());
str = "图片上传成功";
}
catch (Exception ex)
{
str = ex.Message.ToString();
}
finally
{
conn.Close();
}
}
return d;
}
...全文
430 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
那就是你直接将stream读取成byte[]数组啊,然后通过ado.net将图片通过paramters参数化的方式存入数据库
laolaixuebiancheng 2017-09-20
  • 打赏
  • 举报
回复
引用 2 楼 starfd 的回复:
存数据库是将stream转为byte[],然后存入数据库 你这个是通过Image持久化到了磁盘 不过一般是将图片持久化到硬盘,然后路径存数据库
不是,我不想将图片保存成文件,我希望他保存在数据库,然后我从数据库读取出来提交给网页,现在是因为我不能将数据流正确转换才不得不用磁盘做了一个中转,我希望直接将数据流存储到数据库
  • 打赏
  • 举报
回复
存数据库是将stream转为byte[],然后存入数据库 你这个是通过Image持久化到了磁盘 不过一般是将图片持久化到硬盘,然后路径存数据库
cancerser 2017-09-20
  • 打赏
  • 举报
回复
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
laolaixuebiancheng 2017-09-20
  • 打赏
  • 举报
回复
引用 5 楼 insus 的回复:
参考这个方法,可以获取图片Stream: http://www.cnblogs.com/insus/archive/2012/10/20/2732169.html
谢谢,搞定了,帮我看看还能不能简化一下。 public int tp_cunchu(string tp_path, string sql, SqlConnection conn, HttpContext context) { //存图片文件 int d = 0; string str = ""; Regex r = new Regex(@"http.+"); if (r.Match(tp_path).ToString() != "") { WebRequest req = (WebRequest)(WebRequest.Create(tp_path)); WebResponse res = (WebResponse)(req.GetResponse()); Stream stm = res.GetResponseStream(); Image img = Image.FromStream(stm); MemoryStream ms = new MemoryStream(); img.Save(ms, System.Drawing.Imaging.ImageFormat.Png); if (img.Width > 0) { byte[] photo = ms.GetBuffer(); try { conn.Open(); SqlCommand com = new SqlCommand(sql, conn); com.Parameters.Add("@photoBinary", SqlDbType.Binary, photo.Length); com.Parameters["@photoBinary"].Value = photo; //SqlDataReader dr= com.ExecuteReader(); d = Convert.ToInt32(com.ExecuteScalar()); str = "图片上传成功"; } catch (Exception ex) { str = ex.Message.ToString(); } finally { conn.Close(); } } } return d; }
insus 2017-09-20
  • 打赏
  • 举报
回复
参考这个方法,可以获取图片Stream: http://www.cnblogs.com/insus/archive/2012/10/20/2732169.html

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧