1. 通过byte[]数据下载文件(这种方法可用于以开放Api的形式传递文件内容)

public void FileDownLoadByByte(byte[] fileData, string fileName)
{
  //添加这个编码可以防止在IE下文件名乱码的问题
  fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8); Response.Clear();
Response.ClearHeaders();
Response.Buffer = true;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.AppendHeader("Content-Length", fileData.Length.ToString());
Response.BinaryWrite(fileData);
Response.Flush();
Response.End();
}

  


2. 根据路劲,从服务器下载文件

/// <summary>
/// 从服务器下载文件
/// </summary>
/// <param name="fileName">客户端保存的文件名</param>
/// <param name="serverFilePath">服务器端要下载的文件路径</param>
protected void LoadFileFromServer(string fileName, string serverFilePath)
{
FileInfo fileInfo = new FileInfo(serverFilePath);
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
Response.End();
}

/// <summary>
/// 微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite
/// 下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。
/// 将后台文件写入 HTTP 响应输出流(不在内存中进行缓冲)
/// </summary>
public void TransmitFile()
{
Response.ContentType = "application/x-zip-compressed";
Response.AddHeader("Content-Disposition", "attachment;filename=download.zip");
string filename = Server.MapPath("~/Download/xx.zip");
Response.TransmitFile(filename);
}

3. 通过流的形式下载文件

public void LoadFileByStream()
{
string fileName = "aaa.txt";//客户端保存的文件名
string filePath = Server.MapPath("~/Download/xx.txt"); //以字符流的形式下载文件
FileStream fs = new FileStream(filePath, FileMode.Open);
byte[] bytes = new byte[(int)fs.Length];
fs.Read(bytes, , bytes.Length);
fs.Close();
Response.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
}

4. Excel下载

参考另一篇博文

http://www.cnblogs.com/TiestoRay/archive/2013/02/02/2576134.html


5. 如果是用的.NET MVC3(及以上) 一切变得更加简单

例如

public ActionResult LoadFile2()
{
string filePath = Server.MapPath("~/Download/xx.jpg");
return File(filePath, "application/x-jpg", "demo.jpg");
}

它共有六种可用形式

FileContentResult File(byte[] fileContents, string contentType);
FileStreamResult File(Stream fileStream, string contentType);
FilePathResult File(string fileName, string contentType);
virtual FileContentResult File(byte[] fileContents, string contentType, string fileDownloadName);
virtual FileStreamResult File(Stream fileStream, string contentType, string fileDownloadName);
virtual FilePathResult File(string fileName, string contentType, string fileDownloadName);

6. Ftp文件处理

参考 C#Ftp文件处理


7. 文件上传

将这种稍作修改即可解决跨域文件上传的问题,具体内容参考  跨域文件上传解决方案

后台代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace SmsWebSystem.Upload
{
/// <summary>
/// FileHandler 的摘要说明
/// </summary>
public class FileHandler : IHttpHandler
{
private const int MAX_UPLOAD_SIZE = ; /// <summary>
/// fileSelector是前台代码中文件控件的name
/// </summary>
/// <param name="req"></param>
/// <param name="res"></param>
/// <returns></returns>
public string UploadFile(HttpRequest req ,HttpResponse res)
{
if (req.Files["fileSelector"].ContentLength > MAX_UPLOAD_SIZE * * )
{
return String.Format("请上传{0}M以内的文件。", MAX_UPLOAD_SIZE);
} string uploadFileName = req.Files["fileSelector"].FileName;
string path = HttpContext.Current.Server.MapPath(uploadFileName);
req.Files["fileSelector"].SaveAs(path);
return "";
} /// <summary>
/// 需要指定上传结束后的回调函数 这里是uploadCallBack
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(HttpContext context)
{
string result = UploadFile(context.Request, context.Response);
if (String.IsNullOrEmpty(result))
{
result = "上传成功";
}
context.Response.Write(String.Format("<script>top.uploadCallBack('{0}');</script>", result));
} public bool IsReusable
{
get
{
return false;
}
}
}
}

前台代码

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<form id="fileform" name = "fileform" enctype="multipart/form-data"
action="FileHandler.ashx" target="hideFrame" method="post">
<input type="file" id="fileSelector" name="fileSelector" />
</form>
<iframe id="hideFrame" name="hideFrame" style="display:none;"></iframe>
<input type="button" id="btnUpload" value="上传" />
</body>
<script>
document.querySelector("#btnUpload").onclick = function () {
this.style.backgroundColor = "blue";
document.querySelector("#fileform").submit();
} function uploadCallBack(rst) {
document.querySelector("#btnUpload").style.backgroundColor = "white";
alert(rst);
}
</script>
</html>

8. 使用文件流写入文件数据

FileStream fs = new FileStream(FILE_PATH,FileMode.OpenOrCreate);

string content = "";//要写入的内容
//获得字节数组
byte [] data =new UTF8Encoding().GetBytes(content); //开始写入,第二个参数用文件流的长度 表示向文件末尾追加内容
fs.Write(data,fs,data.Length); //清空缓冲区
fs.Flush(); //关闭流
fs.Close();

要注意的一点是,如果上传的文件过大,可能会报异常

【HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值】

需要配置IIS配置文件(%windir%/system32/inetsrv/config/applicationhost.config)及项目配置文件 web.config

具体内容参考 《IIS请求筛选模块被配置为拒绝超过请求内容长度的请


9.使用文件流读取文件数据

byte[] byData = new byte[];

//读取文件
FileStream fs = new FileStream(FILE_PATH,FileMode.Open);
byte[] tmpData = new byte[fs.Length];
char[] charData = new char[fs.Length];
fs.Read(tmpData, , );
//解码
Decoder d = Encoding.UTF8.GetDecoder();
d.GetChars(tmpData, , tmpData.Length, charData, ); Console.WriteLine(charData);

接下来还有通过BufferedStream 读写文件的方式,未完待续

参考 https://msdn.microsoft.com/zh-cn/library/3dsccbf4(VS.80).aspx

C# 文件操作(上传,下载,读取,写入)的更多相关文章

  1. JAVAWEB之文件的上传下载

    文件上传下载 文件上传: 本篇文章使用的文件上传的例子使用的都是原生技术,servelt+jdbc+fileupload插件,这也是笔者的习惯,当接触到某些从未接触过的东西时,总是喜欢用最原始的东西将 ...

  2. python使用ftplib模块实现FTP文件的上传下载

    python已经默认安装了ftplib模块,用其中的FTP类可以实现FTP文件的上传下载 FTP文件上传下载 # coding:utf8 from ftplib import FTP def uplo ...

  3. 使用Fileupload完成文件的上传下载

    目录 使用Fileupload完成文件的上传下载 为什么需要进行文件上传下载? 引入jar包 文件上传 注意事项 编写一个简单的文件上传jsp页面 编写Servlet Student类用于封装数据,后 ...

  4. 在Window的IIS中创建FTP的Site并用C#进行文件的上传下载

    文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机. 这些文件存储在运行 FTP 服务器软件的服务器计算机上. 然后,远程计算机可以使用 FTP ...

  5. 创建FTP的Site并用C#进行文件的上传下载

    创建FTP的Site并用C#进行文件的上传下载 文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机. 这些文件存储在运行 FTP 服务器软件的服 ...

  6. linux链接及文件互相上传下载

    若排版紊乱可查看我的个人博客原文地址 基本操作 本篇博客主要介绍如何去链接远程的linux主机及如何实现本地与远程主机之间文件的上传下载操作,下面的linux系统是CentOS6.6 链接远程linu ...

  7. Spring实现文件的上传下载

    背景:之前一直做的是数据库的增删改查工作,对于文件的上传下载比较排斥,今天研究了下具体的实现,发现其实是很简单.此处不仅要实现单文件的上传,还要实现多文件的上传. 单文件的下载知道了,多文件的下载呢? ...

  8. SocketIo+SpringMvc实现文件的上传下载

    SocketIo+SpringMvc实现文件的上传下载 socketIo不仅可以用来做聊天工具,也可以实现局域网(当然你如果有外网也可用外网)内实现文件的上传和下载,下面是代码的效果演示: GIT地址 ...

  9. SSM框架之中如何进行文件的上传下载

    SSM框架的整合请看我之前的博客:http://www.cnblogs.com/1314wamm/p/6834266.html 现在我们先看如何编写文件的上传下载:你先看你的pom.xml中是否有文件 ...

  10. php文件夹上传下载控件分享

    用过浏览器的开发人员都对大文件上传与下载比较困扰,之前遇到了一个php文件夹上传下载的问题,无奈之下自己开发了一套文件上传控件,在这里分享一下.希望能对你有所帮助. 以下是实例的部分脚本文件 这里我先 ...

随机推荐

  1. 【Git使用】强制推送代码到多个远程仓库

    只吃了一个香蕉的晚上 一直预报的台风没有来,大盘也飘红了,世界好像变得越来越美好了似的.前两天,晚上下班坐地铁回家,靠在地铁门上看书,竟然坐到了终点站已全然不知,我也不知道我怎么了.怎么了.怎么了!最 ...

  2. 复利计算v6.0--web版--软件工程

    一.结对同伴 姓名:蔡舜 学号: 博客园地址:http://www.cnblogs.com/caishun/ http://www.cnblogs.com/caishun/p/5392896.html ...

  3. 6/14 sprint2 看板和燃尽图的更新

    看板: 燃尽图: 例会照: 总结:因为最近刚好碰上端午假期,再加上程序出了点问题,所以导致进度有点慢, 但是我们还是很努力地在找资料把问题给解决了,虽然完成的情况有点不如人意, 但是我们付出的努力还是 ...

  4. ADO.NET基础01

    数据库中数据的导入导出   在使用一些数据库时,很多时候都要将文件导入导出到指定的文件夹中: 数据的导入导出就必须用到stream函数,这就必须用到Using System.IO的命名空间: **在数 ...

  5. Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示

    一直以来,都希望整合一个以客户为中心的平台,有两个方面的考虑:一是实现客户数据.客户关系.客户管理等方面的整合,以便更好利用好客户的相关资源,发挥最大的营销效益:二是整合目前我的开发框架的所有模块和技 ...

  6. WPF中实现自定义虚拟容器(实现VirtualizingPanel)

    WPF中实现自定义虚拟容器(实现VirtualizingPanel) 在WPF应用程序开发过程中,大数据量的数据展现通常都要考虑性能问题.有下面一种常见的情况:原始数据源数据量很大,但是某一时刻数据容 ...

  7. LINQ TO XML 个人的一些心得1

    最近没事做,刚来到一个新公司.写了一些处理xml的项目  就是把一些xml的数据处理后存储到数据库中.原本还是准备用原来的xml来写的.在群里有个人说,用linq to xml 好了,比较快捷.就看了 ...

  8. JMS学习(二)- JMS Message Model 组成介绍及消息头详解

    一.前言 从本文起依次详细介绍JMS中的一些重要的概念,主要参考了官方的JMS1.1的文档,该文档很老了,是02年的,那年,JAVA还没有被Oracle收购..本文主要介绍Message及其相关概念, ...

  9. mysql查询今天,昨天,近7天,近30天,本月,上一月数据的方法(摘录)

    mysql查询今天,昨天,近7天,近30天,本月,上一月数据的方法分析总结: 话说有一文章表article,存储文章的添加文章的时间是add_time字段,该字段为int(5)类型的,现需要查询今天添 ...

  10. yii2.0 图片上传(摘录)

    文章来源:http://blog.sina.com.cn/s/blog_88a65c1b0101izmn.html 下面小伙就带领大学学习一下 Yii2.0 的图片上传类的使用,还是老样子,如果代码样 ...