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