一、同步上传

文章 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. python虚拟环境迁移

    python虚拟环境迁移: 注意事项:直接将虚拟环境复制到另一台机器,直接执行是会有问题的. 那么可以采用以下办法: 思路:将机器1虚拟环境下的包信息打包,之后到机器2上进行安装: (有两种情况要考虑 ...

  2. javascript将base64编码的图片数据转换为file并提交

    /** @param base64Codes 图片的base64编码 */ function sumitImageFile(base64Codes){ var form=document.forms[ ...

  3. 转:select2 使用教程(简)

    用了这么久的Select2插件,也该写篇文章总结总结.当初感觉Select2不是特别好用,但又找不到比它更好的下拉框插件. 在我的印象里Select2有2个版本,最新版本有一些新的特性,并且更新了一下 ...

  4. sql 查询所有作业的详情

    DECLARE @WeekDays TABLE ( freq_interval INT, weekdays ) ) INSERT INTO @WeekDays ,N'星期日 ' UNION ALL , ...

  5. 从拥抱开源到回馈开源,灵雀云助力CNCF中国区培训业务

    6月27日,全球首屈一指的开源盛会 2018 LinuxCon + ContainerCon + CloudOpen China (LC3)在中国北京国家会议中心落下帷幕.二度落地中国的LC3大会热度 ...

  6. 2015年上海现场赛重现 (A几何, K暴力搜索)

    A: 题目链接 :https://vjudge.net/contest/250823#problem/A 参考 : https://www.cnblogs.com/helenawang/p/54654 ...

  7. MyBatis探究-----为实体类Bean取别名,配置typeAliases

    1.单个实体类设置别名 1.1 不使用alias <typeAliases> <!-- typeAlias:为某个java类型起别名 ; type:指定要起别名的类型全类名; 默认别 ...

  8. redis的 rdb 和 aof 持久化的区别

    aof,rdb是两种 redis持久化的机制.用于crash后,redis的恢复. rdb的特性如下: Code: fork一个进程,遍历hash table,利用copy on write,把整个d ...

  9. C# rtsp 转码rtmp nginx踩下的坑

    最近有一个项目, 进行步态识别的时候,同时需要显示摄像的实时画面.对于 Winform 显示画面,之前针对 rtmp 流的时候,是先写一个HTML 网页加载视频流,然后在IIS上发布,将地址直接赋值给 ...

  10. pgrep

    优势:可以只显示进程号 pgrep -l 显示进程名