H5單張、多張圖片保存續篇

前言

這篇是接上篇內容。還沒看的能夠看H5單張、多張圖片上傳這篇文章預熱。html

 

圖片入庫

本章咱們就來看看如何讓多種圖片保存至數據庫中。數據庫:mysql   後端:.NET Coremysql

咱們回顧一下上篇咱們給出的Html結構ajax

        <form method="post" class="form-horizontal submitClubData auto-refresh" enctype="multipart/form-data" asp-action="UpdateClubs">
            <div class="row">
               <div class="col-xs-10 col-sm-8 mTop5">
                 <label title="上傳俱樂部相冊" for="ClubImagesUpload" id="btnClubImg" class="col-sm-2"><input type="file" accept="image/*" name="ClubImagesUpload" id="ClubImagesUpload" class="hide" multiple="multiple">
<img src="/Images/registerNewSite/btn_addimg.png" class="addImg"/> </label> </div> </div> <div class="row"> <div class="col-xs-9"> <div id="clubInputImagePreview" class="col-sm-9 img-preview img-preview-sm"></div> </div> </div> <form/>

 首先,咱們確定的有個數據表 用於存儲咱們的imgage信息。給用於存儲二進制的字段命名imagesql

注意image類型爲mediumblob。這幾種類型的區別是存儲容量的大小:數據庫

MySQL的四種BLOB類型
類型 大小(單位:字節)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G後端

接着,咱們須要定義實體Model數組

/// <summary>
/// add club images
/// </summary>
public IList<IFormFile> ClubImagesUpload { get; set; }

而後是進行表單提交 注意type=submitasync

 $(".submitClubData").submit(function (e) {
            var layerMsg = layer.load(1,
                {
                    icon: 1,
                    shade: [0.3]
                });
            e.preventDefault();

            var form = $(this);
            var url = form.attr('action');
            var formData = new FormData(this);
            var refresh = form.hasClass('auto-refresh');

            $.ajax({
                type: "POST",
                url: url,
                data: formData,
                contentType: false,
                processData: false,
                success: function (data) {
                    layer.closeAll();
                    if (data.isSuccess) {
                        layer.msg('保存成功');
                        if (refresh) {
                            window.setTimeout(function () { location.reload() }, 1000);
                        } else {
                            form.find('.close_model_button').click();
                        }
                    } else {
                        layer.msg(data.failMessage);
                    }
                }
            });

        });

而後 經過表單提交了,咱們就能夠將頁面數據以對象形式post至控制器中:ide

 public async Task<IActionResult> UpdateClubs(實體類 model)
{ 
       OperationResult result=new OperationResult();

       model.ClubsImageData = ThumbnailListImageData(model.ClubImagesUpload, 128, 128);//將FormFile文件轉換爲byte數組
    
       result.IsSuccess = await _crewManager.UpdateClub(model);
       return result;
}

 private List<byte[]> ThumbnailListImageData(IList<IFormFile> files, int width, int height)
        {
            List<byte[]> result=new List<byte[]>();
            if ((files == null) || (files.Count == 0))
            {
                return null;
            }

            Parallel.ForEach(files.Take(9), new ParallelOptions() {MaxDegreeOfParallelism = 5}, item =>
            {
                try
                {
                    if ((item != null) && (item.Length > 0))
                    {
                        using (var stream = new MemoryStream((int)item.Length))
                        {
                            item.CopyTo(stream);
                            var source = Image.FromStream(stream);
                            var thumbnail = source.GetThumbnailImage(width, height, ThumbnailCallback, IntPtr.Zero);
                            using (var outputStream = new MemoryStream())
                            {
                                thumbnail.Save(outputStream, System.Drawing.Imaging.ImageFormat.Png);
                                result.Add(outputStream.ToArray());

                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError($"ThumbnailListImageData Error:{e.Message}");
                    throw;
                }
            });
            return result;
        }

經過這個控制器,咱們獲得了存有byte的圖片集合,如今,咱們只須要將這些圖片放入數據庫中便可post

        public async Task<bool> UpdateClub(int regattaId, 實體集合clubDetail)
        {
               var flag = false;
         
using (var conn = GetMySqlConnection(regattaId)) { if (conn.State == ConnectionState.Closed) { await conn.OpenAsync(); } using (var transaction = conn.BeginTransaction()) { try {
                        //由於前臺有隊上傳圖片個數有限制,因此數量很少,這裏咱們直接使用循環插入的方式
foreach (var item in clubDetail.ClubsImageData) { const string sqlFour = @"insert into clubinfo_image(clubinfo_id,image,isvalid) values(@clubInfoId,@clubimage,@_isvalid); select max(id) from clubinfo_image;"; var clubimageMaxId = (await conn.QueryAsync<int>(sqlFour, new { clubInfoId = clubInfoId, clubimage = item, _isvalid = true, }, commandType: CommandType.Text)).FirstOrDefault(); }

                            transaction.Commit();

                            flag = true;
                            return flag;


                        }
                        catch (Exception ex)
                        {
                            _logger.LogError($"UpdateClub Error :{ex.Message}");
                            transaction.Rollback();
                            throw;
                        }

                    }
               }
          }

效果演示

 

舒適提示 

若是是編輯,要讀取數據庫中這些byte數據,只須要經過

 Convert.ToBase64String(club.ImageData)//將byte轉換爲Base64位字符串

若是有多張圖片,能夠用一個List<string>存放,而後再前臺依次展現便可:

                      <div class="row">
                        <div class="col-xs-9">
                            @foreach (var item in Model.ClubImageDataBase64)
                            {
                                <div id="clubInputImagePreview" class="col-sm-9 img-preview img-preview-sm" style="background-image: url('data:image/png;base64,@item');></div>
                            }
                        </div>
                    </div>

展現效果:

 

 

本文完~

相關文章
相關標籤/搜索