asp.net core解析sz文件

起因

  最近项目中,遇到一个医院的一个检查项目(很早的项目)创建图片的sz文件,sz后缀文件浏览器本身是不支持的,百度了一下,还是没能找到如何解析.
  最后,在公司的一个项目中发现竟然可以解析sz文件.那个项目竟然没有了源码,还好有ILSpy.
  因为sz文件浏览器不支持,当然项目比较早,只能判断是sz文件,将图片地址指向一个一般处理程序(ashx)

通过代码上手

public class FileController : Controller
{
    /// <summary>
    /// 跟asp.net webform和asp.net mvc不一样,通过注入的方式,获取项目所在路径
    /// </summary>
    private IHostingEnvironment _hostEnv;
    public FileController(IHostingEnvironment env)
    {
        _hostEnv = env;
        //其他服务
    }

    /// <summary>
    /// 展示sz文件(这里是项目中),不考虑文件名加密
    /// 生产服务中,图片跟项目不一定是同一个服务器
    /// 方式1 通过映射盘的方式,向访问本地文件一样
    /// 方式2 通过http请求,要用服务器(iis)映射
    /// </summary>
    /// <param name="fileName">文件名称</param>
    /// <param name="pageIndex">页码</param>
    /// <returns></returns>
    public IActionResult ShowImage(string fileName, int pageIndex)
    {
        if (string.IsNullOrEmpty(fileName))
        {
            var path = Path.Combine(_hostEnv.ContentRootPath, "UploadFile", "404.png");
            return File(path, "image/png");
        }
        else
        {
            var path = Path.Combine(_hostEnv.ContentRootPath, "UploadFile", fileName);
            using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                long totalSize = stream.Length;                          //文件的大小
                byte[] first = new byte[8];
                stream.Read(first, 0, first.Length);
                string firstContent = Encoding.ASCII.GetString(first);
                int pageNum = int.Parse(firstContent.Substring(0, 3));   //sz图片数量

                //这里读取都是不压缩的sz文件
                int flag = int.Parse(firstContent.Substring(3, 1));      //标志位, 0代表不进行压缩 1代表GZIP压缩 2代表BZip2

                byte[] array = new byte[8 * pageNum];                    //如果sz文件只有一张的话,这里可以固定new byte[8]
                stream.Read(array, 0, array.Length);
                string string2 = Encoding.ASCII.GetString(array);        //
                long[] array2 = new long[pageNum];                       //存放每张图片的大小
                for (int i = 0; i < pageNum; i++)
                {
                    array2[i] = long.Parse(string2.Substring(8 * i, 8));
                }

                byte[] array3;
                if (pageNum == 1)                                        //只有一张图片情况                                 
                {
                    stream.Position = (long)array2[0];
                    array3 = new byte[totalSize - (long)array2[0]];
                }
                else                                                     //如果不止一张,要计算每张图片的大小
                {
                    long startPostion = array2[pageIndex - 1];           //开始读取的位置
                    long fileSize = 0;                                   //每张图片的大小
                    if (pageIndex == pageNum)
                    {
                        fileSize = totalSize - array2[pageIndex - 1];
                    }
                    else
                    {
                        fileSize = array2[pageIndex] - array2[pageIndex - 1];
                    }
                    stream.Position = startPostion;                      //图片开始读取的位置
                    array3 = new byte[fileSize];
                }

                stream.Read(array3, 0, array3.Length);
                return File(array3, "image/jpeg");
            }
        }
    }
}

效果


秋风 2017-02-20