如何通过 HttpWebRequest 上传文件?

咨询区

  • dr. evil

我不希望通过 WebDAV 文件夹的方式上传文件,我想通过相关的 HttpWebRequest 类,类库或者代码片段来帮我模拟浏览器行为来上传文件,请问是否有好的解决方案?

回答区

  • Joshcodes

如果你用的是基于 .NET 4.5 以上的版本,直接从 NuGet 上引用 Microsoft.Net.Http 工具包即可,不需要任何扩展代码,外部代码或者 HTTP 低级别的代码,参考如下例子:

private async Task<System.IO.Stream> UploadAsync(string url, string filename, Stream fileStream, byte [] fileBytes)
{// Convert each of the three inputs into HttpContent objectsHttpContent stringContent = new StringContent(filename);// examples of converting both Stream and byte [] to HttpContent objects// representing input type fileHttpContent fileStreamContent = new StreamContent(fileStream);HttpContent bytesContent = new ByteArrayContent(fileBytes);// Submit the form using HttpClient and // create form data as Multipart (enctype="multipart/form-data")using (var client = new HttpClient())using (var formData = new MultipartFormDataContent()) {// Add the HttpContent objects to the form data// <input type="text" name="filename" />formData.Add(stringContent, "filename", "filename");// <input type="file" name="file1" />formData.Add(fileStreamContent, "file1", "file1");// <input type="file" name="file2" />formData.Add(bytesContent, "file2", "file2");// Invoke the request to the server// equivalent to pressing the submit button on// a form with attributes (action="{url}" method="post")var response = await client.PostAsync(url, formData);// ensure the request was a successif (!response.IsSuccessStatusCode){return null;}return await response.Content.ReadAsStreamAsync();}
}
  • Stefan

关于文件上传,除了单文件,我的类库中还支持多文件上传,无本地文件的流上传,参考下面代码:

public class FormFile 
{public string Name { get; set; }public string ContentType { get; set; }public string FilePath { get; set; }public Stream Stream { get; set; }
}public class RequestHelper
{public static string PostMultipart(string url, Dictionary<string, object> parameters) {string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");byte[] boundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);request.ContentType = "multipart/form-data; boundary=" + boundary;request.Method = "POST";request.KeepAlive = true;request.Credentials = System.Net.CredentialCache.DefaultCredentials;if(parameters != null && parameters.Count > 0) {using(Stream requestStream = request.GetRequestStream()) {foreach(KeyValuePair<string, object> pair in parameters) {requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);if(pair.Value is FormFile) {FormFile file = pair.Value as FormFile;string header = "Content-Disposition: form-data; name=\"" + pair.Key + "\"; filename=\"" + file.Name + "\"\r\nContent-Type: " + file.ContentType + "\r\n\r\n";byte[] bytes = System.Text.Encoding.UTF8.GetBytes(header);requestStream.Write(bytes, 0, bytes.Length);byte[] buffer = new byte[32768];int bytesRead;if(file.Stream == null) {// upload from fileusing(FileStream fileStream = File.OpenRead(file.FilePath)) {while((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)requestStream.Write(buffer, 0, bytesRead);fileStream.Close();}}else {// upload from given streamwhile((bytesRead = file.Stream.Read(buffer, 0, buffer.Length)) != 0)requestStream.Write(buffer, 0, bytesRead);}}else {string data = "Content-Disposition: form-data; name=\"" + pair.Key + "\"\r\n\r\n" + pair.Value;byte[] bytes = System.Text.Encoding.UTF8.GetBytes(data);requestStream.Write(bytes, 0, bytes.Length);}}byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");requestStream.Write(trailer, 0, trailer.Length);requestStream.Close();}}using(WebResponse response = request.GetResponse()) {using(Stream responseStream = response.GetResponseStream())using(StreamReader reader = new StreamReader(responseStream))return reader.ReadToEnd();}}
}

然后像下面这样使用。

RequestHelper.PostMultipart("http://www.myserver.com/upload.php", new Dictionary<string, object>() {{ "testparam", "my value" },{ "file", new FormFile() { Name = "image.jpg", ContentType = "image/jpeg", FilePath = "c:\\temp\\myniceimage.jpg" } },{ "other_file", new FormFile() { Name = "image2.jpg", ContentType = "image/jpeg", Stream = imageDataStream } },});

点评区

这是一个老问题了,不过谈灵活莫过于 HttpWebRequest

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验 2 关键字驱动测试(2 学时)实验报告--软件功能测试与性能测试实验

以下是实验要求部分&#xff1a;&#xff08;小伙伴们根据自己需求决定是否下载哈&#xff09; 下载位置链接&#xff1a;https://download.csdn.net/download/qq_44872173/20031354

小手工纸盒机器人_亲子手工 | DIY弹珠迷宫小黑手自制玩具系列

上周用鞋盒做的迷你桌球受到很多男孩子的喜欢今天小黑手又做了一个瓦楞纸手工「弹珠迷宫」也是喜欢的爱不释手呢暑假小黑手系列&#xff0c;希望也能攒出个自己的小游乐场自己动手做自己的玩具&#xff0c;买玩具的钱可以省了快速手工教程Let’s do it我们一起做起来吧&#xf…

linux网络编程之用select方法实现io复用(基于udp)

1、基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合:   (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。   (2)当一个客户同时处理多个套接口时,而这种情况是可能…

Linux screen 常用命令

想必&#xff0c;只要接触过Linux一段时间的人&#xff0c;一定知道screen这个神奇的工具了&#xff0c;它主要有如下些优势&#xff1a; 1. 后台运行&#xff1a;当你在ssh terminal执行shell时&#xff0c;如果网络这时断开&#xff0c;你的程序会怎样&#xff1f;TERMINATED…

实验 3 检查点和参数化实验报告--软件功能测试与性能测试实验

实验报告下载链接&#xff1a; https://download.csdn.net/download/qq_44872173/20031539 实验要求部分&#xff1a;

SNS社区

SNS&#xff0c;全称Social Networking Services&#xff0c;即社会性网络服务&#xff0c;专指旨在帮助人们建立社会性网络的互联网应用服务。1967年&#xff0c;哈佛大学的心理学教授Stanley Milgram(1933&#xff5e;1984)创立了六度分割理论&#xff0c;简单地说&#xff1…

C#中的语句

寄语接下来几篇文章&#xff0c;将和大家一起简单回顾下C#中常规的语法&#xff0c;也是平常我们在编码过程中都使用的。今天来介绍下C#中的语句。一般科班出身的程序猿们大家第一个学习的语言基本都是C语言&#xff0c;C语言里面在刚开始就介绍了语句。C#中介绍的语句和C中的基…

track文件 什么是git_Git 从入门到放弃命令大全

对于刚学 Git 的朋友来说太痛苦了&#xff0c;一堆命令&#xff0c;于是就有了这篇文章&#xff0c;对于常用的命令进行梳理。Workspace&#xff1a;工作区Index / Stage&#xff1a;暂存区Repository&#xff1a;仓库区(或本地仓库)Remote&#xff1a;远程仓库1. 初始化 在当前…

【51NOD】1201 整数划分

【题意】将n划分成不同正整数的和的方案数。 【算法】动态规划 【题解】 暴力&#xff1a;f[i][j]:只用前1..i的数字&#xff0c;总和为j的方案数 本质上是01背包&#xff0c;前i个物体&#xff0c;总质量为j的方案数 f[i][j]f[i-1][j]f[i-1][j-i] 复杂度O(n^2) 优化&#xff1…

linux c之assert函数使用总结

1、assert函数介绍 assert宏的原型定义在<assert.h>中&#xff0c;其作用是如果它的条件返回错误&#xff0c;则终止程序执行&#xff0c;原型定义&#xff1a;#include <assert.h> void assert( int expression ); assert的作用是现计算表达式 expression &#x…

Activity加载View调用顺序

2019独角兽企业重金招聘Python工程师标准>>> 在Activity的onCreate方法中&#xff0c;可以通过setContentView()方法来设置此Activity要显示的界面。在xml中的布局文件需要先解析成View树才能加载显示&#xff0c;通过View的onMeasure,onLayout,onDraw方法完成View的…

使用 kube-bench 和 kube-hunter 对 Kubernetes 集群风险评估

点击上方蓝字关注 &#x1f446;&#x1f446;↓推荐关注↓随着 Kubernetes 越来越受欢迎&#xff0c;门槛也越来越低。但是安全问题仍然存在&#xff0c;下面介绍两个审计集群安全的开源工具。kube-benchkube-bench[1] 是一个 Go 应用程序&#xff0c;拥有 4.5k star。用于检查…

实验 4 操作、输出值和数据表实验报告--软件功能测试与性能测试实验

下载链接&#xff1a; https://download.csdn.net/download/qq_44872173/20031742

linux网络编程之setsockopt()函数来设置socket状态以及getsockopt函数只用总结

1、setsockopt函数 头文件:#include <sys/types.h> #include <sys/socket.h>定义函数:int setsockopt(int s, int level, int optname, const void * optval, ,socklen_toptlen); 函数说明:setsockopt()用来设置参数s 所指定的socket 状态. 参数level 代表欲设…

easyui 排序实现

1.对easyui datagrid 返回的数据&#xff0c;进行排序处理&#xff0c;便于搜索到我们的有用的信息。 例如&#xff1a; 2.datagrid 需要设置 sortable : true {field : crtTime,title : 创建时间,width : 100,sortable :true,align : center,formatter : crtTimeFtt}, 3.F12…

hm编码工具使用_H.265视频编码与技术全析(下)

H.265视频编码与技术全析&#xff08;下&#xff09;四&#xff0e;帧内预测模式共35个&#xff08;h264有9个&#xff09;&#xff0c;包括Planar&#xff0c;DC&#xff0c;33个方向模式&#xff1a;除了Intra_Angular预测外&#xff0c;HEVC还和H.264/MPEG-4 AVC一样&#x…

redmine安装指引

为什么80%的码农都做不了架构师&#xff1f;>>> 1 前言 本文记录了在window7下面安装redmine的操作过程&#xff0c;同时也为其他有兴趣安装redmine的同学提供帮助。 2 环境说明 操作系统&#xff1a;window7 64位 数据库&#xff1a;mysql-5.5.36-winx64 Red…

.NET 诞生已20周年,您的 .NET 技能是否还停留在2010 年?

20年来&#xff0c;我们见证了超过上千万.NET 开发员&#xff0c;当前有600万.NET 开发者正在使用.NET技术构建各类解决方案。今天&#xff0c;IT市场对.NET 开发人员的需求达到了前所未有的程度,特别是在中国&#xff0c;各大公司对.NET 程序员的需求用火爆来形容都不为过&…

实验 5 性能测试脚本录制和开发实验报告--软件功能测试与性能测试实验

实验内容&#xff1a; 下载链接&#xff1a; https://download.csdn.net/download/qq_44872173/20031769

MySQL-5.5.33主从复制

搭建主从同步需要在两个电脑上分别安装 MySQL &#xff0c;我这里安装的是 CentOS6.7 64位&#xff0c;MySQL-5.5.33。MySQL 是二进制包安装的&#xff1a;http://aby028.blog.51cto.com/5371905/1892818两台的操作是一样的&#xff0c;要求能够登陆 mysql 数据库即可。主从地址…