文件上传(页面端)
1.文件上传必须用post提交
2.必须修改表中提交数据时的组织方式,即enctype=“multipart/form-data”,数据是以分隔符的方式提交的
3.enctype="application/x-www-form-urlencoded"默认以键值对的方式提交,因此不适合文件上传
enctype默认值就是application/x-www-form-urlencoded
-------------------------------------------------------------------------
<form action="processUpload.ashx" method="post" enctype="multipart/form-data">
请选择文件 <input type="file" name="name" value="" />
<input type="submit" value="提交" />
</form>
服务器端单文件上传
1.获取用户上传的文件
2.将文件另存为服务器的目录下
if (context.Request.Files.Count>0)
{
HttpPostedFile fileData = context.Request.Files[0];
if (fileData.ContentLength>0)//文件的字节数是否大于0
{
string new_fileName = Guid.NewGuid().ToString() + "_" + Path.GetFileName(fileData.FileName);//处理文件名,保证文件名是唯一的
//任何类都继承至object,object里有GetHashCode(),获取(基本是唯一的,也有重复的)唯一的返回整数的哈希码
int hash_code = new_fileName.GetHashCode();//获得哈希码
//计算出使用该整数和二进制“1111”(就是16进制0xf)与,获取当前证书的最后4位值
int dir1 = hash_code & 0xf;//第一次目录
//将原始的hash——code向右移四位
hash_code = hash_code >> 4;
int dir2 = hash_code & 0xf;//第二层目录
//路径拼接
string targetFilePath = Path.Combine(context.Request.MapPath("../Upload/"), dir1.ToString(), dir2.ToString());
//判断文件夹是否存在,不存在则创建一个此目录
if (!Directory.Exists(targetFilePath)) {
Directory.CreateDirectory(targetFilePath);
}
targetFilePath = Path.Combine(targetFilePath, new_fileName);
fileData.SaveAs(targetFilePath);
context.Response.Write("上传成功");
}
}
3.不要同aspx来处理文件上传,因为aspx有生命后期,用aspx来处理会降低性能
4.上传重名的文件,原来的文件会被覆盖
5.用guid来处理文件重名的问题
判断上传只允许图片,保证文件安全
//获取文件后缀名,判断图片文件
string ext = Path.GetExtension(fileData.FileName);
if ((ext==".jpg"||ext==".jpeg"||ext==".png"||ext==".gif"||ext==".bmp"||ext==".tif")&&fileData.ContentType.ToLower().StartsWith("image"))
{
}
文件下载 (必须把ashx.cs删掉,代码写在ashx文件上)
< % @ WebHandler Language=”C#”
Class=”GeologyWorkManage.FileUpload.DownloadFile” % >
using System;
using System.Web;
///
/// 处理下载
///
public class DownloadFile : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.Clear();
context.Response.ClearContent();
context.Response.ClearHeaders();
context.Response.ContentType = "application/octet-stream";
string path = context.Server.MapPath(context.Request["filedir"]);
string FileName = context.Request["filename"];
//设置响应报文头,告诉浏览器如何处理,是一个附件,需要下载
context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename=\"{0}\"", HttpUtility.UrlEncode(FileName)));//处理中文名乱码问题
context.Response.WriteFile(path);
context.Response.Flush();
context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
response.End()
立即结束请求,
本文来自博客园,作者:NE_STOP,转载请注明原文链接:https://www.cnblogs.com/alineverstop/p/18004717