Angular文件上传---fileUpload的使用
Angular文件上传---fileUpload的使用
龙马行空 发表于3年前
Angular文件上传---fileUpload的使用
  • 发表于 3年前
  • 阅读 1482
  • 收藏 2
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: angular的fileUpload的好处就是可以达到表格数据和文件同时分开上传。现在我整理的代码有几个问题,就是文件是必须有的,如果没有就会报错,这个时候可以在代码中先判断一下文件是否存在,也可以给input标签加一个change事件再执行,还可以用ng-file-select指令,总之方法有很多。还有就是没有添加进度条,如果想要进度条可以在回调函数中用parseInt(100.0*evt.loaded/evt.total)

文件上传在系统中是一个很常见的功能,现在将angular文件上传的代码总结一下。在此特别感谢同事陈卫兵提供的思路总结。

1、前端页面

(1)提交的时候用ng-submit进行提交。

(2)form表单的enctype属性改为multipart/form-data

(3)增加一个文件上传的input

 <form ng-submit="submitDrgMetaData()" enctype="multipart/form-data">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                    <h4 class="modal-title">新增信息</h4>
                </div>
                <div class="modal-body clearfix">

                    <div class="col-md-4" ng-repeat=" con in Drgaggregate">
                        <label>{{con.chName}}</label><input type="text" ng-model="DrgObj[con.field]"
                                                            pattern="({{con.pattern}})"
                                                            class="{{con.className}}"
                                                            title="{{con.errorMsg}}"/>
                    </div>
                    <div class="col-md-4">
                        <label>上传文件</label>
                        <input type="file" id="Drgfile-to-upload" class="inpbackblue">
                    </div>
                </div>
                <div class="modal-footer ">
                    <button type="submit" class="btn btn-danger">确定</button>

                </div>
            </div>
        </form>

2、angular中的处理

(1)在define中要引入fileUpload和angularFileUpload模块

配置paths和shim
fileUpload: 'scripts/js/file-upload/angular-file-upload',

define(['angular','./basicData_service', 'fileUpload'], function (angular) {
    'use strict';
    angular.module('apt.basicData.controllers', ['apt.basicData_service', 'angularFileUpload'])

// 表格数据和文件上传事件
            $scope.submitMetaData = function () {
                $scope.imgObj.RefId = $scope.id;
                console.log($scope.imgObj);
                var $file = document.getElementById('file-to-upload').files[0];
                console.info($file);

                $upload.upload({
                    url: 'http://localhost:8888/api/ImageMetaData',
                    method: "POST",
                    data: {data: $scope.imgObj},
                    file: $file
                }).then(function (response) {
                    $scope.getImgMetaData($scope.id)
                       $('#ImageMetaFrom').modal('hide');

                });


            }

3、后台的处理

(1)后台中的数据和文件是分别获取的。

 // POST api/tombskeepingstatus
        public virtual HttpResponseMessage Post()
        {
            if (ModelState.IsValid)
            {
                if (!Request.Content.IsMimeMultipartContent("form-data"))
                    throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);

                var form = HttpContext.Current.Request.Form["data"];
                ImageMetaData image = JsonHelper.DeserializeFromJson<ImageMetaData>(form);//ConvertToModel(form);


                //获取表单中的文件

                var fileinfo = HttpContext.Current.Request.Files[0];
                image.RomotePath = FileLoadHelper.Up(fileinfo);
                tasks.SaveOrUpdate(image);
                /* var message = new HttpRequestMessage();*/
                /*message.Headers.Add("FileName", result.);
                message.Headers.Add("Directory", result.Directory);*/
                /* return base.Post(value);*/
                
                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created,image);
                return response;
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest);
            }
        }

namespace Apt.MWSGR.Domain.Utils
{
    using System;

    /// <summary>
    /// 
    /// </summary>
    public class JsonHelper
    {
        /// <summary>
        /// 序列化
        /// </summary>
        /// <param name="obj">要序列化的实体</param>
        /// <returns>序列化后的字符串</returns>
        public static string SerializeToJson(object obj)
        {
            //Json.Net
            return Newtonsoft.Json.JsonConvert.SerializeObject(obj);
        }

        /// <summary>
        /// 反序列化
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public static Object DeserializeFromJson(string json)
        {
            return Newtonsoft.Json.JsonConvert.DeserializeObject(json);
        }

        /// <summary>
        /// 反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="json"></param>
        /// <returns></returns>
        public static T DeserializeFromJson<T>(string json)
        {
            return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
        }
    }
}

namespace Apt.MWSGR.Infrastructure.Utils
{
    using System.IO;
    using System.Web;

    public class FileLoadHelper
    {
        /// <summary>
        /// 文件根目录
        /// </summary>
        private static readonly string Root = HttpContext.Current.Server.MapPath("~/Files/");

        /// <summary>
        /// 文件上传
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public static string Up(HttpPostedFile file)
        {
            // 根据MD5,计算存放路径
            string result = Md5Helper.GetMd5FromFile(file.InputStream);
            result = result.Replace('-', '\\');
            string filename = result.Substring(result.LastIndexOf('\\'));

            string filePath = Path.Combine(Root, result.Substring(0, result.LastIndexOf('\\') + 1));
            string fileType = file.FileName.Substring(file.FileName.LastIndexOf('.'));
            Directory.CreateDirectory(filePath);
            file.SaveAs(filePath.Trim('\\') + filename + fileType);
            return result+fileType;
        }
    }
}

namespace Apt.MWSGR.Infrastructure.Utils
{
    using System;
    using System.IO;
    using System.Linq;
    using System.Security.Cryptography;
    using System.Text;

    public class Md5Helper
    {
        /// <summary>
        /// 将一个string 通过默认MD5算法得到散列字符串
        /// </summary>
        /// <param name="input">源字符串</param>
        /// <returns>散列字符串</returns>
        /// 
        public static string GetMd5FromString(string input)
        {
            MD5 md5 = MD5.Create();
            byte[] buffer = Encoding.UTF8.GetBytes(input);
            buffer = md5.ComputeHash(buffer);
            md5.Clear();
            md5.Dispose();
            return BitConverter.ToString(buffer);
        }
        /// <summary>
        /// 由文件全路径获取一个文件的MD5值,采用默认算法
        /// </summary>
        /// <param name="path">文件全路径</param>
        /// <returns></returns>
        public static string GetMd5FromFile(string path)
        {
            string res = "";
            //MD5 md5 = MD5.Create();
            using (FileStream fs = File.OpenRead(path))
            {
                //byte[] buffer = md5.ComputeHash(fs);
                //md5.Clear();
                //md5.Dispose();
                //res = BitConverter.ToString(buffer);
                res = GetMd5FromFile(fs);
            }
            //md5.ComputeHash();
            return res;
        }

        /// <summary>
        /// 由Stream得到一个MD5字符串
        /// </summary>
        /// <param name="stream">Stream</param>
        /// <returns>MD5</returns>
        public static string GetMd5FromFile(Stream stream)
        {
            string res = "";
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            byte[] buffer = md5.ComputeHash(stream);
            buffer = buffer.Skip(4).Take(8).ToArray();
            md5.Clear();
            md5.Dispose();
            res = BitConverter.ToString(buffer);
            return res;
        }
    }
}



共有 人打赏支持
粉丝 380
博文 127
码字总数 102144
×
龙马行空
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: