一、同步上传

文章 https://www.cnblogs.com/duanjt/p/6420172.html 里面有提到服务端通过WebApi如何实现文件上传,这里就只说客户端使用WebClient上传,直接上代码:

private void button2_Click(object sender, EventArgs e)
{ try
{
string url = "http://localhost:29817/api/values/SaveFile"; if (string.IsNullOrEmpty(this.textBox1.Text))
{
MessageBox.Show("请先选择要上传的文件");
return;
} string fileName = this.textBox1.Text;//文件全路径(e:\abc.txt)
string safeFileName = Path.GetFileName(fileName);//文件名(abc.txt) WebClient client = new WebClient();
client.Credentials = CredentialCache.DefaultCredentials;
client.Headers.Add("Content-Type", "application/form-data");//注意头部必须是form-data
client.QueryString["fname"] = safeFileName;
byte[] fileb = client.UploadFile(new Uri(url), "POST", fileName);
string res = Encoding.UTF8.GetString(fileb);
MessageBox.Show(res);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

注意:

1.Header的Content-Type必须设置为application/form-data

二、异步上传

上面是同步方式上传,下面是异步方式上传

private void button2_Click(object sender, EventArgs e)
{
try
{
string url = "http://localhost:29817/api/values/SaveFile";
if (string.IsNullOrEmpty(this.textBox1.Text))
{
MessageBox.Show("请先选择要上传的文件");
return;
} string fileName = this.textBox1.Text;//文件全路径(e:\abc.txt)
string safeFileName = Path.GetFileName(fileName);//文件名(abc.txt) WebClient client = new WebClient();
//定义事件,上传成功事件和上传进度事件
client.UploadFileCompleted += client_UploadFileCompleted;
client.UploadProgressChanged += client_UploadProgressChanged; client.Credentials = CredentialCache.DefaultCredentials;
client.Headers.Add("Content-Type", "application/form-data");//注意头部必须是form-data
client.QueryString["fname"] = safeFileName;
//异步上传,通过事件回调获取运行状态
client.UploadFileAsync(new Uri(url), "POST", fileName); }
catch (Exception ex)
{
MessageBox.Show("错误:"+ex.Message);
}
} //上传进度事件,修改进度条
void client_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
{
progressBar1.Minimum = ;
progressBar1.Maximum = (int)e.TotalBytesToSend;
progressBar1.Value = (int)e.BytesSent;
progressBar1.Text = e.ProgressPercentage.ToString(); } //上传完成事件,判断是否上传成功
void client_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
{
if (e.Error == null)
{
progressBar1.Value = progressBar1.Maximum;
this.label2.Text = "上传成功.";
}
else
{
MessageBox.Show("上传错误:" + e.Error.Message);
this.label2.Text = "上传失败.";
}
}

说明:

1.上传的方法由UploadFile修改为UploadFileAsync,这个方法是异步的,非阻塞。

2.注册WebClient的两个事件UploadFileCompleted和UploadProgressChanged,用于显示进度。

三、大文件上传

大文件传输

1.服务端web.config需要配置最大的请求:

<configuration>
<system.web>
<httpRuntime targetFramework="4.5" maxRequestLength="" />
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength=""/>
</requestFiltering>
</security>
</system.webServer>
</configuration>

2.WebApi代码

[HttpPost]
public String SaveFile()
{
var request = HttpContext.Current.Request;
if (request.Files.Count > 0)
{
HttpPostedFile file= request.Files.Get(0);
file.SaveAs(Path.Combine("E:", file.FileName));
}
return "1";
}

备注:

1.一般配置为最大2G差不多了,如果比2G还大,建议使用FTP上传吧。

C# WebClient实现文件上传的更多相关文章

  1. 使用WebClient进行文件上传

    注释部分为异步上传,几行代码就能搞定 public static bool Upload(string url, string path) { using (WebClient client = ne ...

  2. C# WebClient 的文件上传下载

    上传文件 string path = openFileDialog1.FileName; WebClient wc = new WebClient(); wc.Credentials = Creden ...

  3. 精讲响应式WebClient第4篇-文件上传与下载

    本文是精讲响应式WebClient第4篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...

  4. C#文件上传和文件下载

    #region 文件上传 private void UpLoadFile(string fileName, string fileNamePath, string uriString) { ); if ...

  5. [sharepoint]rest api文档库文件上传,下载,拷贝,剪切,删除文件,创建文件夹,修改文件夹属性,删除文件夹,获取文档列表

    写在前面 最近对文档库的知识点进行了整理,也就有了这篇文章,当时查找这些接口,并用在实践中,确实废了一些功夫,也为了让更多的人走更少的弯路. 系列文章 sharepoint环境安装过程中几点需要注意的 ...

  6. 文件上传下载(C#,web,asp.net)

    目的:在浏览器页面启动上传下载CS软件,实现文件的批量下载与上传. 技术路线: 开发上传下载客户端CS程序与注册程序,压缩放到服务器端指定位置: 开发服务器端程序用以接收上传请求,压缩放到服务器端: ...

  7. C# WinForm 文件上传下载

    /// <summary> /// WebClient上传文件至服务器 /// </summary> /// <param name="fileNamePath ...

  8. HTTP文件上传

    看到网上很多链接文件(word.pdf...)可以下载,想制作http下载链接. 其实是将某文件直接放在服务器上搭建的网站上某目录下即可,例如:http://xxx:port/UpgradePack/ ...

  9. C# 应用 - 使用 WepApp 处理文件上传、下载请求

    1. 代码 /// <summary> /// 文件上传下载控制器 /// </summary> public class FileController : ApiContro ...

随机推荐

  1. myeclipse2017下载安装与破解详细教程

    下载myeclipse2017百度云下载路径: 链接:https://pan.baidu.com/s/1wQYwO2zrUvbbUcjCB5B8IQ 密码:6igu myeclipse2017破解文件 ...

  2. WebApi接口访问异常问题。尝试创建“testController”类型的控制器时出错。请确保控制器具有无参数公共构造函数

    本来运行的好好的webAPI 接口突然报了个 :“尝试创建“testController”类型的控制器时出错.请确保控制器具有无参数公共构造函数” 错误.耗了半宿最终解决了, 原因: api控制器中引 ...

  3. 201902<<百岁人生>>

    过年的那段时间,在家看到公司推荐的10本2019年必读书籍,里面有这本书,于是就开始了.... 第一次这么认真的看这类书籍,看完之后感触颇多,毕竟这个问题我从没思考过,很少站在这样的高度去看所有方方面 ...

  4. spring-boot 参考链接

    http://blog.csdn.net/jsu_9207/article/details/66472096 http://blog.csdn.net/lu1005287365/article/det ...

  5. 【数据结构】算法 LinkList (Merge Two Sorted Lists)

    合并2个有序链表 list A, list B, Solution: 对A,B 表按序读取数据,比较大小后插入新链表C. 由于两个输入链表的长度可能不同,所以最终会有一个链表先完成插入所有元素,则直接 ...

  6. TTL集成门电路

    一.TTL集成门电路的结构1.总体结构 所谓TTL就是transistor transistor logic,就是说是由晶体管和晶体管之间构成电路. 2.    TTL集成门电路典型输入级形式 1)二 ...

  7. laravel-admin 上传图片过程中遇到的问题

    1. 报错 Disk [admin] not configured, please add a disk config in `config/filesystems.php`. 在config/fil ...

  8. 1344:【例4-4】最小花费 dijkstra

    1344:[例4-4]最小花费 Dijkstra (1)a [ i ] [ j ] 存转账率(..转后所得率..) (2)dis [ i ] 也就是 a [ 起点 ] [ i ] (3)f [ i ] ...

  9. java项目word文件转html文件

    最近在项目开发中用户提出要在电脑上没有装office时在浏览器中打开word文件,最后确定的逻辑:用户选择想要查看的文件,页面js判断文件是否为word.不是执行下载,是后端根据word文件后缀访问对 ...

  10. 二分优化lis和STL函数

    LIS:最长上升子序列: 这个题我们很显然会想到使用dp, 状态设计:dp[i]代表以a[i]结尾的LIS的长度 状态转移:dp[i]=max(dp[i], dp[j]+1) (0<=j< ...