如何用jQuery将辅助信息合并到二进制文件里一起上传到WCF

在上传文件的时候,往往需要传递当前用户的一些其它的辅助信息,在此提供一个将这些辅助信息合并入二进制文件中一起上传的方法。

下面代码将选中文件上传的同时,将传送会话Id、文件后缀、文件类型三个参数。

整个合并后的二进制流分成三部分,如下图。第一段用1个字节表示辅助信息的长度,当然,若第二段比较长,则可以用双字节来表示;第二段是辅助信息,这里用json格式的字符串转换成ASCII码数组来表示;第三段为选中文件的实际内容。

页面及JavaScript代码如下:

<input id="File" type="file"/>
// 使用POST方式提交服务器
function SendFileToServer(filename, filecontent) {
    $.ajax({
        type: "POST",
        url: "PictureService.svc/SendIdCardPicture",
        dataType: 'application/json; charset=utf-8',
        cache: false,
        processData: false,
        data: filecontent,
        success: function (data) {
            console.log(data);
        }
    });
}

// File控件选择一个文件时触发change后的函数
$('#File').change(function (evt) {
    // 界面中有type=file的input控件
    if (evt.target.files.length > 0) {
        // 遍历所有type=file的input控件
        for (var i = 0; i < this.files.length; i++) {
            var file = this.files[i];
            var reader = new window.FileReader();
            // 定义执行下面reader.readAsArrayBuffer后触发的load事件的处理函数
            reader.onload = function (rResult) {

                // 生成文件名
                var filename = GetGUID();

                // 设置一起传递的辅助信息,这里包含sessionId、 imageType、fileExtName三项数据
                var obj = {};
                obj.sessionId = $("#sessionId").val();
                obj.imageType = 1;
                obj.fileExtName = "png";
                var jsonShop = $.toJSON(obj);
                // 把字符串转换成由字符ASCII码组成的数组
                var arr = Array.prototype.map.call(jsonShop, function (c) { return c.charCodeAt(0); });
                // 在上述数组前面加入1个字符长度的数据,用以表示数组长度
                arr.unshift(arr.length);

                // 创建一个全新的ArrayBuffer,长度为上述数组长度+文件长度
                var buffer = new ArrayBuffer(rResult.target.result.byteLength + arr.length);
                // 生成视图,因为只有在视图里才能读取和插入数据
                var dataview = new DataView(buffer);

                // 把数组推入视图
                for (var i = 0; i < arr.length; i++) {
                    dataview.setUint8(i, arr[i]);
                }

                // 因为rResult.target.result是ArrayBuffer类型,所以需要先转成视图才能读取里面的数据
                var result = new DataView(rResult.target.result);

                // 把文件每个字节推入视图
                for (var i = 0; i < rResult.target.result.byteLength ; i++) {
                    dataview.setUint8(i + arr.length, result.getUint8(i));
                }

                // 调用上传方法
                SendFileToServer(filename, buffer);
            };

            // 读取文件,该方法会触发load事件,并将生成的ArrayBuffer赋予reader.result。
            reader.readAsArrayBuffer(file);
        };
    }
});

服务器端代码如下:

[ServiceContract]
public class PictureService
{
    [OperationContract]
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    public bool SendPicture(Stream imageContext)
    {
        // 读取二进制数据
        byte[] m_Bytes = ReadToEnd(imageContext);

        // 获取第二段的长度
        int len = (int)m_Bytes[0];

        // 从二进制数据中复制出第二段数据
        byte[] data = new byte[len];
        Array.Copy(m_Bytes, 1, data, 0, len);
        // 将复制出的数据转换成字符串,然后通过jsonConvert反序列化为ImgInfo对象
        string Jsonstr = System.Text.Encoding.Default.GetString(data);
        ImgInfo imgInfo = JsonConvert.DeserializeObject<ImgInfo>(Jsonstr);

        // 读取图片文件数据
        byte[] Imagedata = new byte[m_Bytes.Length - 1 - len];
        Array.Copy(m_Bytes, 1 + len, Imagedata, 0, m_Bytes.Length - 1 - len);

        // 判断保存目录是否存在,若不存在则创建
        string filePath = @"D:\Image\";
        if (!System.IO.Directory.Exists(filePath))
        {
            System.IO.Directory.CreateDirectory(filePath);
        }

        // 生成文件名称
        string imageName = DateTime.Now.ToString("yyyyMMDDhhmmss.") + imgInfo.FileExtName;

        string imageFullPath = filePath + imageName;

        // 若文件已存在,则放弃
        if (!File.Exists(imageFullPath))
        {
            try
            {
                // 将获取的二进制数据写入文件
                System.IO.File.WriteAllBytes(imageFullPath, Imagedata);
                imageContext.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }

    public byte[] ReadToEnd(System.IO.Stream stream)
    {
        long originalPosition = 0;

        if (stream.CanSeek)
        {
            originalPosition = stream.Position;
            stream.Position = 0;
        }

        try
        {
            byte[] readBuffer = new byte[4096];

            int totalBytesRead = 0;
            int bytesRead;

            while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)
            {
                totalBytesRead += bytesRead;

                if (totalBytesRead == readBuffer.Length)
                {
                    int nextByte = stream.ReadByte();
                    if (nextByte != -1)
                    {
                        byte[] temp = new byte[readBuffer.Length * 2];
                        Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);
                        Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);
                        readBuffer = temp;
                        totalBytesRead++;
                    }
                }
            }

            byte[] buffer = readBuffer;
            if (readBuffer.Length != totalBytesRead)
            {
                buffer = new byte[totalBytesRead];
                Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);
            }
            return buffer;
        }
        finally
        {
            if (stream.CanSeek)
            {
                stream.Position = originalPosition;
            }
        }
    }

    public class ImgInfo
    {
        /// <summary>
        /// 文件类型:身份证、营业执照、上岗证、其它证书
        /// </summary>
        public int ImageType { get; set; }

        /// <summary>
        /// 文件扩展名
        /// </summary>
        public string FileExtName { get; set; }

        /// <summary>
        /// 会话Id
        /// </summary>
        public string SessionId { get; set; }
    }
}
时间: 2024-12-24 23:11:15

如何用jQuery将辅助信息合并到二进制文件里一起上传到WCF的相关文章

处理带说明信息的图片与处理文件上传 四(62)

一 .处理带说明信息的图片与处理文件上传  void delete()           删除保存在临时目录中的文件.     String getContentType()  获取文档的类型           Returns the content type passed by the browser or null if not defined. String getFieldName() 获取字段的名称,即name=xxxx           Returns the name of

使用Jcrop.js和jQuery.form.js,用ImageIO等进行头像上传缩放及裁剪

首先,Java代码里带一个获取ImageReader的Iterator /** * 从网上摘抄的. * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 声称能够解码指定格式. * 参数:postFix - 包含非正式格式名称 .(例如 "jpeg" 或 "tiff")等 . * * @param postFix * 文件的后缀名 * @author 刘各欢 * @return */ public Iterator&

ASP.NET中的文件操作(文件信息,新建,移动,复制,重命名,上传,遍历)(亲测详细)

做了几天的文件操作,现在来总结一下,错误之处,还望指点!以文件为例,如果对文件夹操作,基本上将File换为Directory即可(例:FileInfo file = new FileInfo(Path);与DirectoryInfo directory = new DirectoryInfo (Path);) 1获取文件信息 在知道文件相对路径的情形,下面代码可以获取文件的详细信息 1 public static void fileinfo(string Path) 2 { 3 Path = S

信息提示板RS232,RS485传感器数据上传到服务器

方案需求 为了解决日益严重的交通拥挤情况,并减缓地面交通对环境的影响,城市已经建立先进的交通管理中心来整合通讯网络,道路可变信息板(CMS)就是其中之一.道路可变信息板是一种智能交通系统,可以提供各种交通信息,例如意外事故.封路.建设延误.限速,以及其他相关交通信息.CMS的通信接口可以是串口或以 太网,如果将所有的CMS用有线的方式整合进一个庞大的交通网络中,并进行安装和维护,是需要大量的成本消耗和时间消耗. 系统部署 由于现有的网络已经就位,交通部门需要一个可以满足以下要求的解决方案: ★

【原创】用JAVA实现大文件上传及显示进度信息

用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 一. 大文件上传基础描述: 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容. 比如: Spring 框架中使用类似CommonsMultipartFile对象处理表二进制文件信息. 而.NET 中使用HtmlInputFile/ HttpPostedFile对象处理二进制文件信息. 优点:使用框架内置对象可以很方便的

jQuery+php实现ajax文件即时上传

很多项目中需要用到即时上传功能,比如,选择本地图片后,立即上传并显示图像.本文结合实例讲解如何使用jQuery和PHP实现Ajax即时上传文件的功能,用户只需选择本地图片确定后即实现上传,并显示上传进度条,上传完成后,显示图片信息. 查看演示DEMO下载源码 HTML 本示例基于jQuery以及相当出色的jquery.form插件,所以,先要载入jquery库和form插件.  <script type="text/javascript" src="jquery.min

jquery uploadify 多文件上传插件 使用经验

Uploadify 官网:http://www.uploadify.com/ 一.如何使用呢? 官网原文:http://www.uploadify.com/documentation/uploadify/implementing-uploadify/在我理解的基础上,做了一些翻译吧,建议直接看官网原文,因为截止到发布这篇博客为止,官方的版本是v3.2.1使用之前我们来看下使用的最低要求. 要求 jQuery 1.4.x 或更新的版本Flash Player 9.0.24 或更新的版本服务器端实现

兼容ie的jquery ajax文件上传

Ajax文件上传插件很多,但兼容性各不一样,许多是对ie不兼容的,另外项目中是要求将网页内容嵌入到桌面端应用的,这样就不允许带flash的上传插件了,如:jquery uploadify...悲剧 对于Ajax文件上传,大体是有: 1.创建一个input type="file" 的文件上传按钮,根据其id监听绑定其change事件,在事件中用jquery创建一个iframe,嵌入添加隐藏form,同时创建input type="file",id相同的文件上传按钮,并

jQuery实现上传进度条效果

效果:(点击上传按钮) See the Pen pjGNJr by moyu (@MoYu1991) on CodePen. html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>upload</title> <link rel="stylesheet" type="text/css" h