C# 向服务器上传文件(客服端winform、服务端web)
转载
首先写客服端,winform模拟一个post提交:
/// <summary>
/// 将本地文件上传到指定的服务器(HttpWebRequest方法)
/// </summary>
/// <param name="address">文件上传到的服务器</param>
/// <param name="fileNamePath">要上传的本地文件(全路径)</param>
/// <param name="saveName">文件上传后的名称</param>
/// <param name="progressBar">上传进度条</param>
/// <returns>成功返回1,失败返回0</returns>
private int Upload_Request2(string address, string fileNamePath, string saveName, ProgressBar progressBar)
{
int returnValue = ; // 要上传的文件
FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs); //时间戳
string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n"); //请求头部信息
StringBuilder sb = new StringBuilder();
sb.Append("--");
sb.Append(strBoundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"");
sb.Append("file");
sb.Append("\"; filename=\"");
sb.Append(saveName);
sb.Append("\";");
sb.Append("\r\n");
sb.Append("Content-Type: ");
sb.Append("application/octet-stream");
sb.Append("\r\n");
sb.Append("\r\n");
string strPostHeader = sb.ToString();
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader); // 根据uri创建HttpWebRequest对象
HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address));
httpReq.Method = "POST"; //对发送的数据不使用缓存
httpReq.AllowWriteStreamBuffering = false; //设置获得响应的超时时间(300秒)
httpReq.Timeout = ;
httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
long fileLength = fs.Length;
httpReq.ContentLength = length;
try
{
progressBar.Maximum = int.MaxValue;
progressBar.Minimum = ;
progressBar.Value = ;
//每次上传4k
int bufferLength = ;
byte[] buffer = new byte[bufferLength]; //已上传的字节数
long offset = ; //开始上传时间
DateTime startTime = DateTime.Now;
int size = r.Read(buffer, , bufferLength);
Stream postStream = httpReq.GetRequestStream(); //发送请求头部消息
postStream.Write(postHeaderBytes, , postHeaderBytes.Length);
while (size > )
{
postStream.Write(buffer, , size);
offset += size;
progressBar.Value = (int)(offset * (int.MaxValue / length));
TimeSpan span = DateTime.Now - startTime;
double second = span.TotalSeconds;
lblTime.Text = "已用时:" + second.ToString("F2") + "秒";
if (second > 0.001)
{
lblSpeed.Text = "平均速度:" + (offset / / second).ToString("0.00") + "KB/秒";
}
else
{
lblSpeed.Text = " 正在连接…";
}
lblState.Text = "已上传:" + (offset * 100.0 / length).ToString("F2") + "%";
lblSize.Text = (offset / 1048576.0).ToString("F2") + "M/" + (fileLength / 1048576.0).ToString("F2") + "M";
Application.DoEvents();
size = r.Read(buffer, , bufferLength);
}
//添加尾部的时间戳
postStream.Write(boundaryBytes, , boundaryBytes.Length);
postStream.Close(); //获取服务器端的响应
WebResponse webRespon = httpReq.GetResponse();
Stream s = webRespon.GetResponseStream();
//读取服务器端返回的消息
StreamReader sr = new StreamReader(s);
String sReturnString = sr.ReadLine();
s.Close();
sr.Close();
if (sReturnString == "Success")
{
returnValue = ;
}
else if (sReturnString == "Error")
{
returnValue = ;
}
}
catch
{
returnValue = ;
}
finally
{
fs.Close();
r.Close();
} return returnValue;
}
protected void Page_Load(object sender, EventArgs e)
{
if (Request.Files.Count > )
{
try
{
HttpPostedFile file = Request.Files[];
//string filePath = "C:\\Documents and Settings\\Administrator\\桌面\\2\\" + file.FileName;//this.MapPath("UploadDocument")
string filePath = "D:\\SourceSafe\\testupform\\" + file.FileName;
file.SaveAs(filePath);
Response.Write("Success");
}
catch
{
Response.Write("Error");
}
}
else
{
Response.Write("Error1");
} }
httpReq.Timeout = 300000;
也要修改,另外别忘了看看IIS的连接超时是否设置为足够大。
- /// <summary>
- /// 将本地文件上传到指定的服务器(HttpWebRequest方法)
- /// </summary>
- /// <param name="address">文件上传到的服务器</param>
- /// <param name="fileNamePath">要上传的本地文件(全路径)</param>
- /// <param name="saveName">文件上传后的名称</param>
- /// <param name="progressBar">上传进度条</param>
- /// <returns>成功返回1,失败返回0</returns>
- private int Upload_Request2(string address, string fileNamePath, string saveName, ProgressBar progressBar)
- {
- int returnValue = 0; // 要上传的文件
- FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
- BinaryReader r = new BinaryReader(fs); //时间戳
- string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
- byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n"); //请求头部信息
- StringBuilder sb = new StringBuilder();
- sb.Append("--");
- sb.Append(strBoundary);
- sb.Append("\r\n");
- sb.Append("Content-Disposition: form-data; name=\"");
- sb.Append("file");
- sb.Append("\"; filename=\"");
- sb.Append(saveName);
- sb.Append("\";");
- sb.Append("\r\n");
- sb.Append("Content-Type: ");
- sb.Append("application/octet-stream");
- sb.Append("\r\n");
- sb.Append("\r\n");
- string strPostHeader = sb.ToString();
- byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader); // 根据uri创建HttpWebRequest对象
- HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address));
- httpReq.Method = "POST"; //对发送的数据不使用缓存
- httpReq.AllowWriteStreamBuffering = false; //设置获得响应的超时时间(300秒)
- httpReq.Timeout = 300000;
- httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
- long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
- long fileLength = fs.Length;
- httpReq.ContentLength = length;
- try
- {
- progressBar.Maximum = int.MaxValue;
- progressBar.Minimum = 0;
- progressBar.Value = 0;
- //每次上传4k
- int bufferLength = 4096;
- byte[] buffer = new byte[bufferLength]; //已上传的字节数
- long offset = 0; //开始上传时间
- DateTime startTime = DateTime.Now;
- int size = r.Read(buffer, 0, bufferLength);
- Stream postStream = httpReq.GetRequestStream(); //发送请求头部消息
- postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
- while (size > 0)
- {
- postStream.Write(buffer, 0, size);
- offset += size;
- progressBar.Value = (int)(offset * (int.MaxValue / length));
- TimeSpan span = DateTime.Now - startTime;
- double second = span.TotalSeconds;
- lblTime.Text = "已用时:" + second.ToString("F2") + "秒";
- if (second > 0.001)
- {
- lblSpeed.Text = "平均速度:" + (offset / 1024 / second).ToString("0.00") + "KB/秒";
- }
- else
- {
- lblSpeed.Text = " 正在连接…";
- }
- lblState.Text = "已上传:" + (offset * 100.0 / length).ToString("F2") + "%";
- lblSize.Text = (offset / 1048576.0).ToString("F2") + "M/" + (fileLength / 1048576.0).ToString("F2") + "M";
- Application.DoEvents();
- size = r.Read(buffer, 0, bufferLength);
- }
- //添加尾部的时间戳
- postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
- postStream.Close(); //获取服务器端的响应
- WebResponse webRespon = httpReq.GetResponse();
- Stream s = webRespon.GetResponseStream();
- //读取服务器端返回的消息
- StreamReader sr = new StreamReader(s);
- String sReturnString = sr.ReadLine();
- s.Close();
- sr.Close();
- if (sReturnString == "Success")
- {
- returnValue = 1;
- }
- else if (sReturnString == "Error")
- {
- returnValue = 0;
- }
- }
- catch
- {
- returnValue = 0;
- }
- finally
- {
- fs.Close();
- r.Close();
- } return returnValue;
- }
C# 向服务器上传文件(客服端winform、服务端web)的更多相关文章
- ASP.NET跨服务器上传文件的相关解决方案
第一种:通过FTP来上传文件 首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了.代码如下: <%@ ...
- xshell终端向远程服务器上传文件方法
centos-7下在本地终端里向远程服务器上传文件,在命令行中执行的软件. 安装命令如下: 在终端里输入如下命令: 会弹出如下窗口 选择你要上传的文件即可上传成功.
- 关于nutz跨服务器上传文件
关于nutz跨服务器上传文件 发布于 578天前 作者 yong9664 770 次浏览 复制 上一个帖子 下一个帖子 标签: 无 是这样的,项目在一台服务器,文件要存储到另外一台服务器 ...
- Java模拟客户端向服务器上传文件
先来了解一下客户端与服务器Tcp通信的基本步骤: 服务器端先启动,然后启动客户端向服务器端发送数据. 服务器端收到客户端发送的数据,服务器端会响应应客户端,向客户端发送响应结果. 客户端读取服务器发送 ...
- idea 内置tomcat jersey 跨服务器 上传文件报400错误
报错内容 com.sun.jersey.api.client.UniformInterfaceException: PUT http://.jpg returned a response status ...
- Javaweb向服务器上传文件以及从服务器下载文件的方法
先导入jar包 点击下载 commons-fileupload是Apache开发的一款专门用来处理上传的工具,它的作用就是可以从request对象中解析出,用户发送的请求参数和上传文件的流. comm ...
- 【FTP】C# System.Net.FtpClient库连接ftp服务器(上传文件)
如果自己单枪匹马写一个连接ftp服务器代码那是相当恐怖的(socket通信),有一个评价较高的dll库可以供我们使用. 那就是System.Net.FtpClient,链接地址:https://net ...
- 使用Putty实现windows向阿里云的Linux云服务器上传文件
1.首先获取PSCP工具 PuTTY小巧方便.但若需要向网络中的Linux系统上传文件,则可以使用PuTTY官方提供的PSCP工具来实现上传.PSCP是基于ssh协议实现. 可以点击这里下载 2.启动 ...
- asp.net 服务器 上传文件到 FTP服务器
private string ftpServerIP = "服务器ip";//服务器ip private string ftpUserID = "ftp的用户名" ...
- 向vsftp服务器上传文件报“550 Permission denied”错误的解决办法
上传文件: ftp> mput db.iso 550 Permission denied 原因:vsftp默认配置不允许上传文件. 解决:修改/etc/vsftpd.conf 将“write_e ...
随机推荐
- tomcat 开机自启方法
1.把下面的代码保存为tomcat文件,并让它成为可执行文件 chmod 755 tomcat. #!/bin/bash # # /etc/rc.d/init.d/tomcat # init scri ...
- 《深入分析Java Web技术内幕》读后感(Tomcat)
第11章 P286 Tomcat总体结构 1.service 2.server 3.组件的生命 Connector Container 1.容器的总体设计 2.Engine容器 3.Host容器 4. ...
- posix 正则库程序
使用的是posix 正则库,参考: http://see.xidian.edu.cn/cpp/html/1428.html 执行匹配的时: gcc myreg.c ip.pat 内容: ip.*[0- ...
- 深度解析VC中的消息传递机制
摘要:Windows编程和Dos编程,一个很大的区别就是,Windows编程是事件驱动,消息传递的.所以,要学好Windows编程,必须 对消息机制有一个清楚的认识,本文希望能够对消息的传递做一个全面 ...
- 读取静态Json文件
创建web项目: string Json = string.Empty; string filePath = Server.MapPath("/***.json");//根目录下的 ...
- socket网络编程实践要点
1.创建udp的socket句柄 // 当host_port为0时,则表示让操作系统自动分配 bool createUdpSocket(string host_ip,unsigned short ho ...
- Fedora/CentOS使用技巧
命令 获取系统安装包的编译源码及脚本 # dnf download --source package # yumdownloader --source virt-viewer 远程连接windows ...
- 3d全景图
http://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Aggarwal_Panoramic_Stereo_Videos_CV ...
- IT兄弟连 JavaWeb教程 经典案例
案例需求:编写一个jsp servlet程序,在login.jsp发起login.do登录请求,当输入的用户名是abc密码是123时,则判断是登录成功,其它暂时认为是登录失败.当用户登录成功时,将用户 ...
- 内置对象(Math对象、Date对象、Array对象、String对象)常用属性和方法
Math对象 Math 是一个内置对象, 它具有数学常数和函数的属性和方法.不是一个函数对象. 与其它全局对象不同的是, Math 不是一个构造函数. Math 的所有属性和方法都是静态的. 跟数学 ...