服务端如何取表单数据和json数据(NETEFMVC接口提交数据或返回json串时压缩和解压方法)
服务端如何取表单数据和json数据(NETEFMVC接口提交数据或返回json串时压缩和解压方法)/// <returns></Returns>/// <param name="param"></param>/// <summary>/// 压缩/// </summary>
NET EF MVC开发接口在上传文件时,或者提交数据或返回json串较大时,需要用到压缩和解压方法,下面给个操作实例,以供参考 :
一、压缩和解压方法
public static class ZipUtil
{
/// <summary>
/// 压缩
/// </summary>
/// <param name="param"></param>
/// <returns></Returns>
public static string Compress(string param)
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(param);
//byte[] data = Convert.FromBase64String(param);
MemoryStream ms = new MemoryStream();
Stream stream = new ICSharpCode.SharpZipLib.Bzip2.BZip2OutputStream(ms);
try
{
stream.Write(data 0 data.Length);
}
finally
{
Stream.Close();
ms.Close();
}
return Convert.ToBase64String(ms.ToArray());
}
/// <summary>
/// 解压
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public static string Decompress(string param)
{
string commonString = "";
byte[] buffer = Convert.FromBase64String(param);
MemoryStream ms = new MemoryStream(buffer);
Stream sm = new ICSharpCode.SharpZipLib.BZip2.BZip2InputStream(ms);
//这里要指明要读入的格式,要不就有乱码
StreamReader reader = new StreamReader(sm System.Text.Encoding.UTF8);
try
{
commonString = reader.ReadToEnd();
}
finally
{
sm.Close();
ms.Close();
}
return commonString;
}
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="sourceFilePath">文件路径</param>
/// <param name="destinationZipFilePath">压缩后的地址</param>
public static void CreateZip(string sourceFilePath string destinationZipFilePath)
{
if (sourceFilePath[sourceFilePath.Length - 1] != System.IO.Path.DirectorySeparatorChar)
sourceFilePath = System.IO.Path.DirectorySeparatorChar;
ZipOutputStream zipStream = new ZipOutputStream(System.IO.File.Create(destinationZipfilePath));
zipStream.SetLevel(6); // 压缩级别 0-9
CreateZipFiles(sourceFilePath zipStream);
zipStream.Finish();
zipStream.Close();
}
/// <summary>
/// 递归压缩文件
/// </summary>
/// <param name="sourceFilePath">待压缩的文件或文件夹路径</param>
/// <param name="zipStream">打包结果的zip文件路径(类似 D:\WorkSpace\a.zip) 全路径包括文件名和.zip扩展名
/// <param name="staticFile"></param>
private static void CreateZipFiles(string sourceFilePath ZipOutputStream zipStream)
{
Crc32 crc = new Crc32();
string[] filesArray = Directory.GetFileSystemEntries(sourceFilePath);
foreach (string file in filesArray)
{
//如果当前是文件夹,递归
if (Directory.Exists(file))
{
CreateZipFiles(file zipStream);
}
//如果是文件,开始压缩
else
{
FileStream fileStream = System.IO.File.OpenRead(file);
byte[] buffer = new byte[fileStream.Length];
fileStream.Read(buffer 0 buffer.Length);
string tempFile = file.Substring(sourceFilePath.LastIndexOf("\\") 1);
ZipEntry entry = new ZipEntry(tempFile);
entry.DateTime = DateTime.Now;
entry.Size = fileStream.Length;
fileStream.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
zipStream.PutNextEntry(entry);
zipStream.Write(buffer 0 buffer.Length);
}
}
}
}
二、解压方法
[HttpPost]
public HttpResponseMessage OffLineAddtransferrecord(object data)
{
HttpResponseMessage result = null;
var ReturnStr = "{\"status\":\"N\" \"msg\":\"参数有误\" \"data\":[]}";
List<M_transferrecord> list = new List<M_transferrecord>();
string Sdata = data.ToString();
var admin = JsonConvert.DeserializeObject<dynamic>(Sdata);//动态对象
string compressdata = null;
if (admin.compressdata != null)
{
compressdata = admin.compressdata;
#region 解压
compressdata = ZipUtil.Decompress(compressdata);
list = JsonConvert.DeserializeObject<List<M_transferrecord>>(compressdata);//动态对象
#endregion 解压
}
//string Sdata = data.ToString();
//List<M_transferrecord> list = JsonConvert.DeserializeObject<List<M_transferrecord>>(Sdata);//动态对象
transactionOptions transactionOption = new TransactionOptions();
//设置事务隔离级别
transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
// 设置事务超时时间为60秒
transactionOption.Timeout = new TimeSpan(0 0 30);
using (TransactionScope trans = new TransactionScope(TransactionScopeOption.Required transactionOption)) //需要事务回滚的地方外面套一层using (TransactionScope sc = new TransactionScope()){}
{
try
{
if (list != null && list.Count > 0)
{
string address = null;
List<M_returntransferrecord> returnlist = new List<M_returntransferrecord>();
foreach (var carditem in list)
{
#region 操作
gpt_Kindergartentransfercard cardModel = ef.gpt_Kindergartentransfercard.Where(a => a.TrialID == carditem.TrialID && a.KindergartenID == carditem.KindergartenID && a.NewEnrolmentID == carditem.NewEnrolmentID && a.transfercardnumber == carditem.transfercardnumber && a.parenttransfercardID == carditem.parenttransfercardID).AsNoTracking().FirstOrDefault();
if (cardModel != null)
{
string photourl = "/gpt001/" "/" carditem.KindergartenID "/transferrecord/" carditem.recordtime.ToString("yyyyMMdd") "/" Guid.NewGuid().ToString() ".jpg";
gpt_transferrecord dd = ef.gpt_transferrecord.Where(a => a.type == carditem.type && a.TrialID == carditem.TrialID && a.KindergartenID == carditem.KindergartenID && a.NewEnrolmentID == carditem.NewEnrolmentID && a.recordtime.Year == carditem.recordtime.Year && a.recordtime.Month == carditem.recordtime.Month && a.recordtime.Day == carditem.recordtime.Day).AsNoTracking().FirstOrDefault();
if (dd == null)
{
decimal transferrecordID = WisdomStarts.Common.Utils.GenerateIntID();
gpt_transferrecord recordmodel = new gpt_transferrecord();
recordmodel.transferrecordID = transferrecordID;
recordmodel.parenttransfercardID = cardModel.parenttransfercardID;
recordmodel.transfercardnumber = carditem.transfercardnumber;
recordmodel.weekname = WisdomStarts.Common.Utils.GetWeekNameByDate(carditem.recordtime 0);
recordmodel.strBase64 = carditem.strBase64;
ef.gpt_transferrecord.Add(recordmodel);
int res = ef.SaveChanges();
if (res > 0)
{
#region 更新考勤信息
new WisdomStars.Bll.Common.Attendance().UpdateAttendanceToddlerssigninBytransfercard(recordmodel.recordtime carditem.type carditem.NewEnrolmentID carditem.Kinder_Class_ID carditem.KindergartenID carditem.TrialID (int)WisdomStarts.Common.Enums.KeyEnum.datasources.终端设备);
#endregion 更新考勤信息
#region 异步上传图片
var postUrl = "http://127.0.0.1/Common/SaveCatalogBase64Image";
Webrequest Request7 = WebRequest.Create(postUrl);
request7.Method = "POST";
//post传参数
string postdata = "strBase64=" HttpContext.Current.Server.UrlEncode(carditem.strBase64) "&subsidiary_id=" carditem.subsidiary_id "&KindergartenID=" carditem.KindergartenID "&imageDir=" photourl;
byte[] bytes = Encoding.ASCII.GetBytes(postdata);
request7.Timeout = 5000;
request7.ContentType = "application/x-www-form-urlencoded";
request7.ContentLength = postdata.Length;
Stream sendStream = request7.GetRequestStream();
sendStream.Write(bytes 0 bytes.Length);
sendStream.Close();
//得到返回值
//WebResponse response7 = request7.GetResponse();
//string OrderQuantity = new StreamReader(response7.GetResponseStream() Encoding.GetEncoding("utf-8")).ReadToEnd();
//var json = JsonConvert.DeserializeObject<dynamic>(OrderQuantity);
//photourl = json.photourl;
#endregion
M_returntransferrecord info = new M_returntransferrecord();
info.type = carditem.type;
info.transfercardnumber = carditem.transfercardnumber;
info.recorddate = recordmodel.recordtime.ToString("yyyy-MM-dd");
returnlist.Add(info);
}
}
else
{
//其它业务逻辑
}
}
#endregion
}
if (returnlist.Count > 0)
{
trans.Complete();
ReturnStr = "{\"status\":\"Y\" \"msg\":\"操作成功\" \"data\":" returnlist.ToEnJsonString() "}";
}
else
{
trans.Complete();
ReturnStr = "{\"status\":\"N\" \"msg\":\"操作失败\" \"data\":" returnlist.ToEnJsonString() "}";
}
}
}
catch (Exception e)
{
trans.Dispose();
}
}
result = new HttpResponseMessage { Content = new StringContent(ReturnStr Encoding.GetEncoding("UTF-8") "application/json") };
return result;
}