当前位置: 首页 > 编程日记 > 正文

文件上传的实现(C#)

文件上传

一.   在Form中一定要将encType设为"multipart/form-data":
<form id="WebForm3" method="post" encType="multipart/form-data" runat="server" >

二.   判断是否有文件上传了:
当用户没有选择任何要上传的文件,即HtmlInputFile控件中的文本框为空时点击了上传按钮后,在服务端得到的File1.PostedFile对象不是null,而是有对象的,所以不能用(File1.PostedFile == null)来判断是否上传了文件,用(File1.PostedFile.ContentLength != 0)来判断比较好

三.   判断上传文件MIMIE类型:
文件上传后可以用File1.PostedFile.ContentType来读取这个文件的MIMIE类型,这个MIMIE类型是系统通过上传文件的后缀名来获得的。

四.   保存上传的文件:

1.    文件可以通过File1.PostedFile.SaveAs(path) //path是服务器上的物理路径,来保存文件。

if(File1.PostedFile.ContentLength != 0)

{

    StringBuilder myStr = new StringBuilder();

    myStr.Append("文件名称:" + File1.PostedFile.FileName);

    myStr.Append("<br>");

    myStr.Append("文件类型:" + File1.PostedFile.ContentType);

    myStr.Append("<br>");

    myStr.Append("文件长度:" + File1.PostedFile.ContentLength.ToString());

    myStr.Append("<br>");

   

    string path = Server.MapPath("./"); //当前路径

    string fileName = File1.PostedFile.FileName.Substring(File1.PostedFile.FileName.LastIndexOf('//')+1);

    path += fileName;

    if(File.Exists(path) == true)

    {

       Label1.Text = "服务器上已经有了你正在上传的文件:" + fileName;

       return;

    }

    File1.PostedFile.SaveAs(path);



    myStr.Append("保存完毕!");

    myStr.Append("<br>");

    Label1.Text = myStr.ToString();

}

else

{

    Label1.Text = "你没有选择要上载的文件或者上传的文件长度为0!";

}


2.    文件也可以通过二进制的读取后存放到数据库的二进制的字段中:
byte[] fileCont = new byte[File1.PostedFile.ContentLength];
File1.PostedFile.InputStream.Read(fileCont,0, File1.PostedFile.ContentLength);
然后将此字节数组fileCont赋给数据库的二进制字段的参数,写到数据库中。



文件下载

一.   服务端通过Response输出相应的HTTP Response Headers信息,和要下载的文件的数据来把文件发送到客户端,HTTP Response Headers表现在html文件中是下面的形式:
<meta http-equiv="Content-Type" content="text/htm ">
http-equiv表示是Headers的名称,content表示这个Headers的值

二.   首先,要输出文件的MIME类型:
Page.Response.AddHeader( "Content-Type", “MIME类型” ); 

三.   其次,要输出下载的文件的打开位置和文件名:
Page.Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName );
content-disposition 的 HTTP response header 允许指定文档表示的信息。使用这种 header ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在 Save As 对话框的“文件名”栏中。
打开位置:
attachment ―― 表示作为附件发送到客户端,客户端将单独打开此文件。
inline ―― 表示将在浏览器中打开这个文件。
文件名:
filename ―― 表示发送到客户端文件的文件名。

四.   准备发送到客户端的文件数据:

1.    先将不同类型来源的数据转成byte类型的数组,再通过Response.BinaryWrite方法发送到客户端:

1.1.   读取文件来获得byte数组: string FileName; //生成或获取要发送到客户端的文件名

string filePath = Server.MapPath("./") + FileName; //假设文件在当前目录下

if(File.Exists(filePath) == false)

{

    //服务器上没有这个文件

    return;

}

FileStream myFile = File.OpenRead(filePath); //读取文件进入FileStream

byte[] fileCont = new byte[myFile.Length];

myFile.Read(fileCont,0,(int)myFile.Length);  //将文件流中的内容转成byte数组


1.2.   在数据库的二进制字段中读取: //从url获取图片的id

string ImageId = Request.QueryString["img"];

//构建查询语句

string sqlText = "SELECT img_data, img_contenttype FROM Image WHERE img_pk = " + ImageId;

SqlConnection connection = new SqlConnection( ConfigurationSettings.AppSettings["DSN"].ToString() );

SqlCommand command = new SqlCommand( sqlText, connection);

connection.Open();

SqlDataReader dr = command.ExecuteReader();

if ( dr.Read())

{

    byte[] fileCont = (byte[]) dr["img_data"] ;

}

connection.Close();


1.3.   从internet上读取文件: HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create( "http://www.via.com/aa.xls ");

HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse();

Stream readStream = myWebResponse.GetResponseStream();

          

byte[] bytes = new byte[readStream.Length];

bytes = readStream.Read(bytes,0,readStream.Length);


通过上述三种方法获得的文件内容的byte数组就可以用来输出了:
Page.Response.BinaryWrite(fileCont);

Page.Response.End();



2.    直接读取文件输出: string FileName; //生成或获取要发送到客户端的文件名

string filePath = Server.MapPath("./") + FileName; //假设文件在当前目录下

if(File.Exists(filePath) == false)

{

    //服务器上没有这个文件

    return;

}

Page.Response.Clear();

Page.Response.AddHeader( "Content-Type", "image/gif" ); //根据MIME的不同设置

Page.Response.AddHeader("Content-Disposition", "inline;filename=" + filePath);

Page.Response.WriteFile(filePath);

Page.Response.End();



内容结束//

相关文章:

C#编程应用--线程与委托

1. C#开发C/S程序&#xff0c;有时需要几个端&#xff0c;如服务器端&#xff0c;管理端&#xff0c;客户端等等&#xff0c; 端与端之间是不同线程或者进程&#xff0c;这就涉及跨线程调用的问题&#xff0c;使用委托或者异步线程是必不可少的&#xff0c;这里是一个简单的委托…

深度整合英特尔傲腾,SmartX首发100us级超低延迟超融合解决方案

6 月 17 日&#xff0c;致力于超融合中高端市场的SmartX公司正式发布基于核心软件 SMTX OS 与英特尔 傲腾™ 持久内存的高性能、低延迟超融合解决方案与SmartX Halo P系列一体机。 SmartX 在业内首次将英特尔傲腾持久内存以App Direct Mode &#xff08;应用直接访问模式&…

caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片

经过前面两篇博文的学习&#xff0c;我们已经训练好了一个caffemodel模型&#xff0c;并生成了一个deploy.prototxt文件&#xff0c;现在我们就利用这两个文件来对一个新的图片进行分类预测。 我们从mnist数据集的test集中随便找一张图片&#xff0c;用来进行实验。 #codingutf…

Android应用程序消息处理机制(Looper、Handler)分析(2)

我们再回到NativeMessageQueue的构造函数中&#xff0c;看看JNI层的Looper对象的创建过程&#xff0c;即看看它的构造函数是如何实现的&#xff0c;这个Looper类实现在frameworks/base/libs/utils/Looper.cpp文件中&#xff1a; Looper::Looper(bool allowNonCallbacks) : …

以下一些使用ASP.NET和VISUAL STUDIO.NET2003的经验和技巧

作者&#xff1a;未知 请作者速与本人联系1,不要在VS里直接复制ASPX文件,因为复制的时候,两个文件会使用同一个类文件,要复制的话,应该建空文件,然后复制页面和代码2,发在项目完工的时候&#xff0c;要想得到一个干净的&#xff0c;仅有必需文件的项目&#xff0c;可以用复制…

微软推出智能语音评测服务,注重解决四大技术障碍

今年5月&#xff0c;在微软开发者大会上&#xff0c;他们宣布推出智能语音评测服务。基于Azure云的认知服务平台&#xff0c;该服务涵盖语音识别、语音合成等技术&#xff0c;主要应用于各种教师评估、作业练习和语言学习等教学场景。 通过市场调研和反馈&#xff0c;他们将语…

这些编程语言程序员工资最高!Java才第四

在众多行业中&#xff0c;程序员属于高薪职业。无论是在国外还是国内&#xff0c;程序员的薪金水平普遍高于其他行业的工作岗位。 高薪的诱惑和充满挑战性的工作&#xff0c;令程序员一直成为备受欢迎的职业。在今年年初&#xff0c;Glassdoor发布的一份调查报告指出&#xff…

仔细选择会话状态提供程序

ASP.NET 为存储应用程序的会话数据提供了三种不同的方法&#xff1a;进程内会话状态、作为 Windows 服务的进程外会话状态和 SQL Server 数据库中的进程外会话状态。每种方法都有自己的优点&#xff0c;但进程内会话状态是迄今为止速度最快的解决方案。如果只在会话状态中存储少…

10.VMware View 4.6安装与部署-view clint和view for ipad连接测试

安装基于 Windows 的 View Client,最终用户需要从物理机打开 View Client 来连接其虚拟桌面。您可以运行基于 Windows 的安装程序文件来安装 View Client 的所有组件。如果 View 管理员启用了某些显示选项&#xff0c;那么除了通过 View Client 访问虚拟桌面外&#xff0c;最终…

免费直播:主流深度框架对比:总有一款适合你~

常常有小伙伴在后台反馈&#xff1a;想了解深度学习该怎么学&#xff1f;自学难度大又没有效果&#xff0c;该怎么办&#xff1f;CSDN为了解决这个难题&#xff0c;联合唐宇迪老师为大家带来了一场精彩的直播【一节课掌握深度学习必备框架】。本次直播将带大家了解在开始深度学…

QCon2016旧金山大会焦点分享者确认

QCon旧金山大会是由InfoQ举办的连续十年的最大的英语会议&#xff0c;它将在今年11月7-9日在旧金山湾区举行。\\在QCon大会涵盖了一系列深入的技术&#xff0c;架构师、资深开发者所关注的国际事件&#xff0c;聚焦创新领域和软件发展趋势&#xff0c;QCon大会每年在美国、中国…

Git 看这一篇就够了

作者 |码农田小齐责编 | Carol封图 | CSDN 下载自视觉中国今天简单讲下 Git 的实现原理&#xff0c;知其所以然才能知其然&#xff1b;并且梳理了日常最常用的 12 个命令&#xff0c;分为三大类分享给你。本文的结构如下&#xff1a;作者和开发原由Git 的数据模型常用命令资源推…

当不使用会话状态时禁用它

并不是所有的应用程序或页都需要针对于具体用户的会话状态&#xff0c;您应该对任何不需要会话状态的应用程序或页禁用会话状态。 若要禁用页的会话状态&#xff0c;请将 Page 指令中的 EnableSessionState 属性设置为 false。例如&#xff0c;<% Page EnableSessionState&…

jepg图像的存储 转

先把代码贴上&#xff1a; extern "C" { #include "jpeglib.h" #pragma comment(lib,"libjpeg.lib") //把无压缩的图像数据&#xff08;纹理&#xff09;存储成jepg bool appSaveJpegRGB(char *filepath,unsigned char * data,int width,int hei…

使用Spring进行统一日志管理 + 统一异常管理

统一日志和异常管理配置好后&#xff0c;SSH项目中&#xff0c;代码以往散落的log.info() 和 try..catch..finally 再也不见踪影&#xff01; 统一日志异常实现类&#xff1a; [java] view plaincopy package com.pilelot.web.util; import org.apache.log4j.Logger; impor…

避免到服务器的不必要的往返过程

虽然您很可能希望尽量多地使用 Web 窗体页框架的那些节省时间和代码的功能&#xff0c;但在某些情况下却不宜使用 ASP.NET 服务器控件和回发事件处理。 通常&#xff0c;只有在检索或存储数据时&#xff0c;您才需要启动到服务器的往返过程。多数数据操作可在这些往返过程间的…

OPPO和微软合作,开放“召唤小冰”

6月24日&#xff0c;OPPO与微软共同宣布&#xff0c;OPPO手机智能助理Breeno语音开放“召唤小冰”能力一年之际&#xff0c;双方合作再次深化。微软小冰与OPPO Breeno团队加速合作&#xff0c;不断打造和更新更符合OPPO生态的AI技能&#xff0c;提升微软小冰在Breeno语音中的产…

如果你即将死去

如果你即将死去&#xff0c;你是否能够安息&#xff1b; 如果你即将死去&#xff0c;你是否还有事情不能放弃&#xff1b; 如果你即将死去&#xff0c;你的事业是否有人继续&#xff1b; 如果你即将死去&#xff0c;你的生平是否还有人惦记&#xff1b; 死亡是所有生命的终点&a…

设计模式(行为型模式)——备忘录模式(Memento)

2019独角兽企业重金招聘Python工程师标准>>> 本章讲讲第三类和第四类。 备忘录模式&#xff08;Memento&#xff09; 主要目的是保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象&#xff0c;个人觉得叫备份模式更形象些&#xff0c;通俗的讲下&#xf…

当你累了,准备放弃时,看看这个吧!!!

当你累了&#xff0c;准备放弃时&#xff0c;看看这个吧&#xff01;&#xff01;&#xff01; 在朋友空间看到这篇文章&#xff0c;送给所有还在坚持的朋友~~每个人都背负着一个沉重的十字架&#xff0c;在缓慢而艰难地朝着目的地前进。途中&#xff0c;有一个人忽然停了下来。…

只在必要时保存服务器控件视图状态

自动视图状态管理是服务器控件的功能&#xff0c;该功能使服务器控件可以在往返过程上重新填充它们的属性值&#xff08;您不需要编写任何代码&#xff09;。但是&#xff0c;因为服务器控件的视图状态在隐藏的窗体字段中往返于服务器&#xff0c;所以该功能确实会对性能产生影…

超越英伟达的,不会是另一款GPU!中国公司发布首款数据流AI芯片

2020年6月23日&#xff0c;鲲云科技在深圳举行产品发布会&#xff0c;发布全球首款数据流AI芯片CAISA&#xff0c;定位于高性能AI推理&#xff0c;已完成量产。鲲云通过自主研发的数据流技术在芯片实测算力上实现了技术突破&#xff0c;较同类产品在芯片利用率上提升了最高11.6…

vim打开多窗口、多文件之间的切换

打开多个文件&#xff1a;一、vim还没有启动的时候&#xff1a;1.在终端里输入 vim file1 file2 ... filen便可以打开所有想要打开的文件2.vim已经启动输入:e file可以再打开一个文件&#xff0c;并且此时vim里会显示出file文件的内容。3.同时显示多个文件&#xff1a;:sp …

图灵奖得主Judea Pearl:从“大数据革命”到“因果革命”

整理 | 智源社区&#xff0c;龚鹤扬&高亦斌2020年6月21日&#xff0c;在第二届北京智源大会开幕式及全体会议上&#xff0c;图灵奖得主、贝叶斯网络奠基人Judea Pearl 做了名为《The New Science of Cause and Effect with reflections on data science and artificial int…

美国两政府网站被挂马 以性丑闻女星为诱饵

据安全厂商趋势科技称&#xff0c;美国两个政府网站近日发现被挂木马&#xff0c;这两家被挂马的网站都是以性丑闻女性为诱饵欺骗用户访问其它恶意网页。  圣伯纳迪诺县的宣传页面被发现感染了恶意木马&#xff0c;用户访问该网站时被重定向到域名Videosdivx.net下的一个网站…

除非有特殊的原因要关闭缓冲,否则使其保持打开

禁用 Web 窗体页的缓冲会导致大量的性能开销。

[React Native Android安利系列]搭建React Native Android环境

欢迎大家收看react-native-android系列教程&#xff0c;跟着本系列教程学习&#xff0c;可以熟练掌握react-native-android的开发&#xff0c;你值得拥有https://segmentfault.com/blog... (PS&#xff0c;和聊一聊系列写在一起也实在是没辙&#xff0c; 谁知道如何新建专栏&am…

继承QTreeWidgetItem发生error: 'staticMetaObject' is not a member of 'QTreeWidgetItem' 错误

点击打开链接 #ifndef QQUSERITEM_H就发生下列错误 #define QQUSERITEM_H #include <QTreeWidgetItem> class QQUserItem :public QTreeWidgetItem { Q_OBJECT public: explicit QQUserItem(QQUserItem *parent 0); signals: public slots: }; #endif // QQUSERITEM_H d…

使用 HttpResponse.Write 方法进行字符串串联

该方法提供非常有效的缓冲和连接服务。但是&#xff0c;如果您正在执行广泛的连接&#xff0c;请使用多个 Response.Write 调用。下面示例中显示的技术比用对 Response.Write 方法的单个调用连接字符串更快。 [C#] Response.Write("a"); Response.Write(myString); …

倒计时 8 天 | 完整议程大揭秘!来 20 个 AI 论坛,与百名大咖携手玩转人工智能...

2020年7月3—4日&#xff0c;由 CSDN 主办的第三届 AI 开发者大会&#xff08;AI ProCon 2020&#xff09;&#xff08;大会官网&#xff1a;https://aiprocon.csdn.net/&#xff09;将以线上直播的形式与大家相见。本次大会历时2天&#xff0c;一次性设立6大主题、20大精彩分论…