zoukankan      html  css  js  c++  java
  • 普通Html文件图片上传(Storing Image To DB)

    一、uploadImage.html

     1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     2 <html xmlns="http://www.w3.org/1999/xhtml">
     3 <head>
     4     <title></title>
     5     <script type="text/javascript">
     6         window.onload = function () {
     7             //            window.encodeURI();
     8             //            window.encodeURIComponent()
     9 
    10             //提交按钮的点击事件。或者是在表单的提交事件
    11             document.getElementById('btnSubmit').onclick = function () {
    12                 //校验用户上传的文件是否合法
    13                 //1.获取用户选择的文件的名称
    14                 var fileName = document.getElementById('fileData').value;
    15 
    16                 //2.获取后缀
    17                 var ext = fileName.substring(fileName.lastIndexOf('.'));
    18                 //3.校验
    19                 if (ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".gif" || ext == ".bmp") {
    20                     return true;
    21                 } else {
    22                     alert('请选择合法的图片文件!');
    23                     return false;
    24                 }
    25             };
    26         };
    27     </script>
    28 </head>
    29 <body>
    30     <!-------  上传文件------------->
    31     <!-- 
    32     1.上传客户端表单需要注意的:
    33     1>表单的提交方式,必须为post。method="post"
    34     2>必须修改表中提交数据时的数据组织方式,设置enctype,enctype="multipart/form-data"
    35     默认情况下,表单的enctype设置如下:enctype="application/x-www-form-urlencoded"。设置完毕该项后,其实最终是设置到了请求报文头的Content-Type中,这种设置,表单中最终数据的组织方式是,类似于下面的这种方式:txtName=%E9%9A%9C%E7%A2%8D%E6%98%AF%E5%93%AA%E4%B8%AA&txtPhone=13888888888&txtEmail=138@163.com&selGroups=3
    36     //当设置enctype="multipart/form-data",时,数据提交方式,是以分割线的方式来组织的。
    37 
    38     3>表单中需要有一个文件域。
    39     -->    
    40     <form action="ProcessUpload.ashx" method="post" enctype="multipart/form-data">
    41     <p>
    42         请输入您的大名:<input type="text" name="txtName" value="" />
    43     </p>
    44     <p>
    45         请选择要上传的文件:<input id="fileData" type="file" name="fileData" value="" />
    46     </p>
    47     <input id="btnSubmit" type="submit" value="提交" />
    48     </form>
    49 </body>
    50 </html>

    二、一般处理程序

     1 /// <summary>
     2     /// 用来处理上传文件的请求
     3     /// </summary>
     4     public class ProcessUpload : IHttpHandler
     5     {
     6 
     7         public void ProcessRequest(HttpContext context)
     8         {
     9             context.Response.ContentType = "text/plain";
    10             //1.获取用户上传的文件
    11             if (context.Request.Files.Count > 0)
    12             {
    13                 //获取第一个文件域中上传上来的文件
    14                 HttpPostedFile fileData = context.Request.Files[0];
    15 
    16                 //判断上传上来的文件字节数是否大于0
    17                 if (fileData.ContentLength > 0)
    18                 {
    19                     string ext = Path.GetExtension(fileData.FileName);
    20 
    21                     if ((ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".gif" || ext == ".bmp") && fileData.ContentType.ToLower().StartsWith("image"))
    22                     {
    23                         #region 计算文件名称和目录,保存文件
    24 
    25                         //通过guid+旧文件名,计算得到一个新的文件名
    26                         string new_fileName = Guid.NewGuid().ToString() + "_" + Path.GetFileName(fileData.FileName);
    27 
    28 
    29                         //获取当前new_fileName的哈希码,就是一个整数。
    30                         int hash_code = new_fileName.GetHashCode();
    31                         //2.使用该整数和二进制值"1111"(也就是16进制值:0xf)与,获取当前整数的最后4为值。 
    32                         int dir1 = hash_code & 0xf;//第一层目录
    33                         //任何类都是继承自object类。object类中有一个方法GetHashCode(),获取当前对象的哈希码。
    34                         //将原始的hash_code值向右移动4位。、
    35                         hash_code = hash_code >> 4;
    36 
    37                         int dir2 = hash_code & 0xf;//得到了第二层目录
    38 
    39                         //路径拼接
    40                         string targetFilePath = Path.Combine(context.Request.MapPath("upload/"), dir1.ToString(), dir2.ToString());
    41                         //判断当前文件夹是否存在,如果不存在则创建文件夹
    42                         if (!Directory.Exists(targetFilePath))
    43                         {
    44                             Directory.CreateDirectory(targetFilePath);
    45                         }
    46                         //2.将用户上传的文件另存为到服务器的目录下。
    47                         //将文件名与目录拼接。
    48                         targetFilePath = Path.Combine(targetFilePath, new_fileName);                        
    49                         fileData.SaveAs(targetFilePath);
    50                         //将文件保存至数据库
    51                         SaveFileStreamToDB(targetFilePath);
    52 
    53                         #endregion
    54 
    55                         context.Response.Write("文件上传成功!");
    56                     }
    57                     else
    58                     {
    59                         context.Response.Write("非法的文件!");
    60                     }
    61                 }
    62             }
    63         }
    64 
    65         /// <summary>
    66         /// 保存图片至数据库
    67         /// </summary>
    68         /// <param name="filePath">图片保存路径</param>
    69         public void SaveFileStreamToDB(string filePath)
    70         {
    71             FileStream fs = new FileStream(filePath, FileMode.Open);
    72             byte[] imageBytes = new byte[fs.Length];
    73             BinaryReader br = new BinaryReader(fs);
    74             imageBytes = br.ReadBytes(Convert.ToInt32(fs.Length));//将图片转换成二进制流
    75 
    76             Images model = new Images { ImageInfo = imageBytes, ImagePath = filePath };
    77             ImagesBll bll = new ImagesBll();
    78             int dbCount = bll.insert(model);
    79         }
    80 
    81         public bool IsReusable
    82         {
    83             get
    84             {
    85                 return false;
    86             }
    87         }
    88     }

    三、DLL数据层

     1 public class ImagesDal
     2     {
     3         //插入操作
     4         public int Insert(Images model)
     5         {
     6             string sql = "insert into storeImageInfo(ImageInfo,ImagePath) values(@imageinfo,@imagepath)";
     7             SqlParameter[] pms = new SqlParameter[] {
     8             new SqlParameter("@imageinfo",System.Data.SqlDbType.Image){ Value=model.ImageInfo},
     9             new SqlParameter("@imagepath",System.Data.SqlDbType.VarChar,200){ Value=model.ImagePath}
    10             };
    11             return SqlHelper.ExecuteNonQuery(sql, System.Data.CommandType.Text, pms);
    12         }
    13     }

    四、运行结果

      

    Then上传成功

      

    点击提交后,查看数据库

    占用的数据库大小:

  • 相关阅读:
    【7】用Laravel5.1开发一个简单的博客系统
    【6】Laravel5.1的migration数据库迁移
    【5】说说Laravel5的blade模板
    【4】优化一下【3】的例子,顺便说说细节
    【3】创建一个简单的Laravel例子
    【2】最简单的Laravel5.1程序分析
    【1】Laravel5.1 安装
    【0】Laravel 5.1 简介
    MySQL常用命令
    Windows8.1使用博客客户端写博客
  • 原文地址:https://www.cnblogs.com/vincentzee/p/4448830.html
Copyright © 2011-2022 走看看