C#——文件上传(一般处理程序ashx)
Framework版本:.Net Framework 4
1、FileInfo实体
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MongoDB.Bson;
using ReligionServer.util;
using ReligionServer.constant; namespace ReligionServer.Model
{
//为什么会有多余的get set方法,因为测试写的,没有删
//封装的一个文件类, 文件基本信息
public class FileInfo
{ public ObjectId _id; public String FileCode { get; set; }//目前还没有研究出ObjectId序列化的最好解决方式, 所以暂时使用FileCode替代Id
public String Name { get; set; }
public String Type { get; set; }
public String Desc { get; set; }
public String Path { get; set; }
public int Access { get; set; }
public String ForeignKey { get; set; }
public DateTime CreateTime { get; set; }
public String TypeCode { get; set; }//辅助字段 public FileInfo() { } public void set_Id(ObjectId id)
{
this._id = id;
} public ObjectId get_Id()
{
return this._id;
} public void setFileCode()
{
this.FileCode = CommonUtil.CreateId();
} public String getFileCode()
{
return this.FileCode;
} public void setName(String name)
{
this.Name = name;
} public String getName()
{
return this.Name;
} public void setType(String type)
{
this.Type = FileTypeConstant.GetType(type);
} public String getType()
{
return this.Type;
} public void setDesc(String desc)
{
this.Desc = desc;
} public String getDesc()
{
return this.Desc;
} public void setPath(String path)
{
this.Path = path;
} public String getPath()
{
return this.Path;
} public void setAccess(int access)
{
this.Access = access;
} public int getAccess()
{
return this.Access;
} public void setForeignKey()
{
this.ForeignKey = CommonUtil.CreateId();
} public String getForeignKey()
{
return this.ForeignKey;
} public void setCreateTime()
{
this.CreateTime = DateTime.Now;
} public DateTime getCreateTime()
{
return this.CreateTime; } public void setTypeCode(String code)
{
this.TypeCode = code;
} public String getTypeCode()
{
return this.TypeCode;
} }
}
2、Handler具体实现
using System; using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ReligionServer.util;
using ReligionServer.Model;
using ReligionServer.service;
using System.Text.RegularExpressions; namespace ReligionServer.handler
{
/// <summary>
/// FileHandler 的摘要说明
/// 处理文件请求
/// </summary>
public class FileHandler : BaseHandler, IHttpHandler
{ private FileInfoService fileInfoService = new FileInfoService();
private readonly String targetSavePath = "~/ReligionFile/"; public void ProcessRequest(HttpContext context)
{
base.InitAction(context);
}
#region 文件上传
//和第三方表关联的文件上传初始化逻辑
public void Upload_Foreign(HttpContext context)
{
Model.FileInfo fileInfo = InitFileInfo(context, );
if (CommonUtil.IsEmpty(fileInfo.getForeignKey()))
{
NoParams<Model.FileInfo>(context, "关联外键为空, 还请检测关联属性是否上传成功, 外键是否为空");
}
else if (base.IsEmpty(fileInfo.getTypeCode()))
{
fileInfo.setTypeCode("");
NoParams<Model.FileInfo>(context, "TypeCode is null or '' ...");
}
else
{
List<Model.FileInfo> uploadFileList = FileInsert(context, InitFileInfo(context, ));
if (uploadFileList.Count == )
{
Error<String>(context, new List<String>() { "上传失败: 后台获取文件信息失败" });
}
else
{
int errorCount = (int)context.Items["FileUploadErrorCount"];
int successCount = uploadFileList.Count - errorCount;
Success<String>(context, new List<String>() { "一共上传 " + uploadFileList.Count + "个文件,其中成功 " + successCount + "个,失败" + errorCount + "个" });
}
} } //文件上传初始化逻辑
public void Upload(HttpContext context)
{
Model.FileInfo fileInfo = InitFileInfo(context, );
if (base.IsEmpty(fileInfo.getTypeCode()))
{
fileInfo.setTypeCode("");
NoParams<Model.FileInfo>(context, "TypeCode is null or '' ...");
}
else {
List<Model.FileInfo> uploadFileList = FileInsert(context, fileInfo);
if (uploadFileList.Count == )
{
Error<String>(context, new List<String>() { "上传失败: 后台获取文件信息失败" });
}
else
{
int errorCount = (int)context.Items["FileUploadErrorCount"];
int successCount = uploadFileList.Count - errorCount;
Success<String>(context, new List<String>() { "一共上传 " + uploadFileList.Count + "个文件,其中成功 " + successCount + "个,失败" + errorCount + "个" });
}
}
} /// <summary>
/// 供类相互调用的文件上传
/// </summary>
/// <param name="context"></param>
/// <param name="foreignKey"></param>
/// <returns></returns>
public List<Model.FileInfo> Upload_Invoke(HttpContext context, String foreignKey) {
if (!base.IsEmpty(foreignKey)) {
Model.FileInfo fileInfo = InitFileInfo(context, );
fileInfo.ForeignKey = foreignKey;
List<Model.FileInfo> uploadFileList = FileInsert(context, fileInfo);
return uploadFileList;
}
return new List<Model.FileInfo>();
} //执行文件转存以及数据库记录插入的方法
private List<Model.FileInfo> FileInsert(HttpContext context, Model.FileInfo fileInfo)
{
List<Model.FileInfo> fileInfoList = new List<Model.FileInfo>(); //List<Model.FileInfo> fileInfoList = new List<Model.FileInfo>();
String directoryName = DateUtil.CurrentDateTimeValue();//文件夹名称
//HttpContext.Current.Request.PhysicalApplicationPath 获取当前正在执行的服务器应用程序的根目录的物理文件系统路径
String targetPhysicalFilePath = HttpContext.Current.Request.PhysicalApplicationPath + "ReligionFile/" + directoryName;
//不存在就创建
if (!Directory.Exists(targetPhysicalFilePath))
{
Directory.CreateDirectory(targetPhysicalFilePath);
} //获取上传文件集合
HttpFileCollection fileCollection = context.Request.Files;
//HttpPostedFile temp = context.Request.Files["regfile"];//测试
//String tempe = context.Request.Params["regfile"];
//HttpPostedFileWrapper fileWrapper = context.Request.Files[0]; Model.FileInfo tempFileInfo = null;
if (fileCollection.Count > )
{
HttpPostedFile item = null;
for (int i = ; i < fileCollection.Count; i++)
{
item = fileCollection[i];
String suffix = item.FileName.Split('.')[item.FileName.Split('.').Length - ];//获取文件的后缀名
tempFileInfo = new Model.FileInfo();
tempFileInfo = (Model.FileInfo)BeanUtil.PropCopy(fileInfo, tempFileInfo);
//tempFileInfo.set_Id(CommonUtil.CreateObjectId());这样设置Id是无效的
tempFileInfo.setName(item.FileName);//存的是以前的文件名, 是否有意义
tempFileInfo.setFileCode();
tempFileInfo.setType(suffix);
tempFileInfo.setCreateTime();
suffix = "." + suffix;
if (suffix.ToLower().Equals(".txt"))
{
suffix = ".doc";//这里是否有必要? 这是个问题
}
String realFileName = Guid.NewGuid().ToString() + suffix;
tempFileInfo.setTypeCode(tempFileInfo.getTypeCode() + ":" + "ReligionFile/" + directoryName + "/" + realFileName);
tempFileInfo.setPath("ReligionFile/" + directoryName + "/" + realFileName);
item.SaveAs(context.Server.MapPath(targetSavePath + directoryName + "/" + realFileName));//文件转存 必须是文件的根目录, 而且不能使虚拟目录
fileInfoList.Add(tempFileInfo);
}
//foreach (String key in fileCollection) {
//这里前台只有一个文件选择框, 那么多文件时keys都是相同的,
// HttpPostedFile item = fileCollection[key];
// String suffix = item.FileName.Split('.')[item.FileName.Split('.').Length - 1];//获取文件的后缀名
// fileInfo.setName(item.FileName);
// fileInfo.setFileCode();
// fileInfo.setType(suffix);
// fileInfo.setCreateTime();
// suffix = "." + suffix;
// if (suffix.ToLower().Equals(".txt")) {
// suffix = ".doc";//这里是否有必要? 这是个问题
// }
// String realFileName = Guid.NewGuid().ToString() + suffix;
// fileInfo.setTypeCode(fileInfo.getTypeCode() + ":" + "ReligionFile/" + directoryName + realFileName);
// item.SaveAs(context.Server.MapPath(targetSavePath + directoryName + "/" + realFileName));//文件转存 必须是文件的根目录, 而且不能使虚拟目录
// fileInfoList.Add(fileInfo);
//}
int errorCount = fileInfoService.InsertBatchFileInfo(fileInfoList);//文件信息批量入表, 返回失败个数
context.Items.Add("FileUploadErrorCount", errorCount); } return fileInfoList; } /// <summary>
/// Base64格式的图片上传
/// </summary>
/// <param name="context"></param>
public void Insert_Base64_Img(HttpContext context)
{
vo.Base64Image base64Image = base.GetInstance<vo.Base64Image>(context, new vo.Base64Image());
if (base.IsEmpty(base64Image.Base64String))
{
NoParams<vo.Base64Image>(context, "上传参数存在空值");
}
else
{
List<Model.FileInfo> fileInfoList = util.ImageUtil.Base64ImageInsertBatch(context, util.ArrraysUtil.PurifyArrays<String>(Regex.Split(base64Image.Base64String, "c#", RegexOptions.IgnoreCase)));
if (fileInfoList.Count > )
{
int errorCount = fileInfoService.InsertBatchFileInfo(fileInfoList);
int successCount = fileInfoList.Count - errorCount;
Success<String>(context, new List<String>() { "一共上传 " + fileInfoList.Count + "个文件,其中成功 " + successCount + "个,失败" + errorCount + "个" });
}
else
{
Error<String>(context, new List<String>() { "上传失败: 后台将Base64转存时失败" });
}
}
} #endregion #region 文件删除 /// <summary>
/// 根据ObjectId删除指定的文件信息
/// </summary>
/// <param name="context"></param>
public void Del_ObjectId(HttpContext context)
{
//暂时不做
} /// <summary>
/// 根据FileCode删除指定的文件信息
/// </summary>
/// <param name="context"></param>
public void Del_FileCode(HttpContext context)
{
Model.FileInfo fileInfo = this.InitFileInfo(context, -);
fileInfo = fileInfoService.FindFileInfoByFileCode(fileInfo.getFileCode());
if (fileInfo != null)
{
if (fileInfoService.RemoveFileInfoByFileCode(fileInfo.getFileCode()))
{
RemoveLocalFile(fileInfo);
Success<Model.FileInfo>(context, new List<Model.FileInfo>() { fileInfo });
}
else
{
Error<Model.FileInfo>(context, new List<Model.FileInfo>() { fileInfo });
}
}
else
{
NoParams<Model.FileInfo>(context, "该条记录不存在,无法删除");
}
} /// <summary>
/// 根据外键ForeignKey删除所关联的文件信息
/// </summary>
/// <param name="context"></param>
public void Del_ForeignKey(HttpContext context)
{ } /// <summary>
/// 根据传递进来的FileInfo的path字段删除服务器上对应的文件
/// </summary>
/// <param name="fileInfo"></param>
private void RemoveLocalFile(Model.FileInfo fileInfo)
{
System.Diagnostics.Debug.WriteLine(HttpContext.Current.Request.PhysicalApplicationPath + fileInfo.getPath());
//FileUtil.RemoveFile(context.Request.PhysicalApplicationPath + fileInfo.getPath());
FileUtil.RemoveFile(HttpContext.Current.Request.PhysicalApplicationPath + fileInfo.getPath());
} #endregion #region 文件修改 /// <summary>
/// 根据FileCode修改指定的文件信息
/// </summary>
/// <param name="context"></param>
public void Update_FileCode(HttpContext context)
{
Model.FileInfo target = InitFileInfo(context, -);
String fileCode = target.getFileCode();
List<Model.FileInfo> list = null;
if (CommonUtil.IsEmpty(target.getForeignKey()) || CommonUtil.IsEmpty(target.getFileCode()))
{
NoParams<Model.FileInfo>(context, "关联外键ForeignKey或FileCode为空");
}
else
{
list = FileInsert(context, InitFileInfo(context, ));
}
if (null != list)
{
target = list[];
target.FileCode = fileCode;
Model.FileInfo source = fileInfoService.FindFileInfoByFileCode(target.getFileCode());
if (null != source)
{
target._id = source._id;
target.Access = source.Access;
target.ForeignKey = source.ForeignKey;
if (fileInfoService.UpdateAllByFileCode(target))
{
RemoveLocalFile(source);//如果上传成功, 就将原来的文件删除
Success<Model.FileInfo>(context, new List<Model.FileInfo>() { fileInfoService.FindFileInfoByFileCode(target.FileCode) });
}
else
{
Error<Model.FileInfo>(context, new List<Model.FileInfo>() { target });
RemoveLocalFile(target);//如果更新失败, 就将上传的文件删除
}
}
else
{
Init<Model.FileInfo>(context, "", "", new List<Model.FileInfo>() { });
}
}
} #endregion #region 文件查找 /// <summary>
/// 根据FileCode查找指定的文件信息
/// </summary>
/// <param name="context"></param>
public void Query_FileCode(HttpContext context)
{
Model.FileInfo fileInfo = fileInfoService.FindFileInfoByFileCode(this.InitFileInfo(context, -).FileCode);
if (fileInfo == null)
{
NoParams<Model.FileInfo>(context, "该记录不存在");
}
else
{
Success<Model.FileInfo>(context, new List<Model.FileInfo>() { fileInfo });
}
} /// <summary>
/// 根据ForeignKey查询所有的文件信息
/// </summary>
/// <param name="context"></param>
public void Query_Foreign(HttpContext context)
{
//Model.FileInfo info = this.InitFileInfo(context, -1);
List<Model.FileInfo> list = fileInfoService.FindFileInfoListByForeignKey(this.InitFileInfo(context, -).ForeignKey);
//if (list == null || list.Count == 0) {
// NoParams<Model.FileInfo>(context, "没有匹配的记录");
//} else {
// Success<Model.FileInfo>(context, list);
//}
Success<Model.FileInfo>(context, list);
} #endregion
//初始化FileInfo
private Model.FileInfo InitFileInfo(HttpContext context, int access)
{
Model.FileInfo fileInfo = ParametersUtil.GetInstanceFormRequest<Model.FileInfo>(context, new Model.FileInfo());//这里主要是获取ForeignKey if (access != -)
{
fileInfo.setAccess(access);//设置文件资源类型 {0表示关联; 1表示独立资源,没有关联} -1表示不作处理
}
return fileInfo;
} public bool IsReusable
{
get
{
return false;
}
}
}
}
C#——文件上传(一般处理程序ashx)的更多相关文章
- Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)(转)
Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现) 相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦 ...
- Asp.Net 无刷新文件上传并显示进度条的实现方法及思路
相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦苦来 实现呢?我并不否认”拿来主义“,只是我个人更喜欢凡是求个所以 ...
- 强大的支持多文件上传的jQuery文件上传插件Uploadify
支持多文件上传的jQuery文件上传插件Uploadify,目前此插件有两种版本即Flash版本和HTML5版本,对于HTML5版本会比较好的支持手机浏览器,避免苹果手机Safari浏览器不支持Fla ...
- jQuery文件上传插件Uploadify(转)
一款基于flash的文件上传,有进度条和支持大文件上传,且可以多文件上传队列. 这款在flash的基础上增加了html5的支持,所以在移动端也可以使用. 由于官方提供的版本是flash免费,html5 ...
- 聊一聊jquery文件上传(支持多文件上传)
谈到文件上传,现在一般都用现成的组件可以使用.PC端的可以使用uploadify.针对微网站H5也有uploadifive.但是这组件并不能满足各种场景的需求,例如:预览 切图 放大缩小,取消之类的. ...
- 基于uploadify.js实现多文件上传和上传进度条的显示
uploadify是JQuery的一个插件,主要实现文件的异步上传功能,可以自定义文件大小限制.文件类型.是否自动上传等属性,可以显示上传的进度条.官网地址是http://www.uploadify. ...
- [Asp.net]通过uploadify将文件上传到B服务器的共享文件夹中
写在前面 客户有这样的一个需求,针对项目中文档共享的模块,客户提出如果用户上传特别的大,或者时间久了硬盘空间就会吃满,能不能将这些文件上传到其他的服务器?然后就稍微研究了下这方面的东西,上传到网络中的 ...
- AjaxUpLoad.js使用实现文件上传
AjaxUpLoad.js的使用实现无刷新文件上传,如图. 图1 文件上传前 图2 文件上传后 1.创建页面并编写HTML [html] view plaincopy 上传文档: <div ...
- 文件上传利器JQuery上传插件Uploadify
在做日常项目中,经常在后台需要上传图片等资源文件,之前使用过几次这个组件,感觉非常好用 ,但是每次使用的时候都是需要经过一番查阅,所以还不如记住在这里,以后使用的时候就翻翻. 他的官方网站如下:htt ...
随机推荐
- /etc/hosts
/etc/hosts 是 Linux 系统中一个负责IP地址与域名快速解析的文件,解析优先级:DNS缓存 > hosts > DNS服务(/etc/resolv.conf) 文件格式:网络 ...
- <linux系统c语言生成.so文件,生成64位可执行文件,在64位系统中运行32位的可执行文件>
1.linux 系统c语言生成.o文件,---->gcc -m64 -c -fPIC test.c -o test.o2.linux 系统c语言生成.so文件,----->gcc -sha ...
- 使用area标签实现标签的嵌套
在项目中我们会碰到这种需求:即点击这个整个a标签跳转到一个页面,点击a里面的某个a再跳转到另一个页面.有人会说,这还不简单,直接a标签嵌套a标签,可是事实如此吗,看代码: <a href=&qu ...
- eclipse export runnable jar
如果要导出可运行的JAR文件,需要选择Runnable Jar File. 方法/步骤 1. 选择要到处JAR文件的工程,右键选择“Export”: 2. 选择“Java-->Run ...
- JDBC--Result 获取返回集合
package jdbc.chap05; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql. ...
- 关于Activity的getReferrer():如何在Activity中获取调用者?
http://blog.csdn.net/u013553529/article/details/53856800 关于Activity的getReferrer()之一:如何在Activity中获取调用 ...
- 【BZOJ4452】[Cerc2015]Export Estimate 并查集
[BZOJ4452][Cerc2015]Export Estimate Description 给你一个n个点m条边的无向图,每条边有权值,我们可以选择一个整数lim来生成一个新的图,过程如下: 1 ...
- highmaps如何自定义 区间的颜色刻度
https://api.highcharts.com/highmaps/colorAxis.dataClassColor http://jsfiddle.net/gh/get/library/pure ...
- onethink插件控制器如何访问?
具体路由分析就不说啦!就是那样.这里我只是方便访问来做一个记录,方便复制粘贴访问: 例如:新增一个Baoming的插件: 那么如何,访问这个控制里面方法呢? 第一种情况:这个控制器使用的是Admin模 ...
- U盘安装Win7系统,遇到硬盘鼠标键盘失灵等情况,如何安装U盘中加入USB3.0驱动的支持
U盘安装系统出现鼠标键盘不能使用,在intel六代处理器平台,安装过程中会出现安装原生镜像不能识别或者鼠标键盘不能使用等情况,可以参考以下方法进行. 风险提示:重装或升级系统会导致系统盘数据丢失,建议 ...