使用 HttpWebRequest 使用 multipart/form-data 发布数据/上传图像

2023-12-20

我正在尝试使用 ImageShack API 上传图像。要使用它,我应该POST图像使用multipart/form-data。我这样做就像...

var postData = "";
var req = HttpWebRequest.Create("http://www.imageshack.us/upload_api.php");
req.Method = "POST";
req.ContentType = "multipart/form-data";
postData += "key=my_key_here&";
postData += "type=base64&";

// get base64 data from image
byte[] bytes = File.ReadAllBytes(@"D:\tmp\WpfApplication1\WpfApplication1\Images\Icon128.gif");
string encoded = Convert.ToBase64String(bytes);
postData += "fileupload=" + encoded;

byte[] reqData = Encoding.UTF8.GetBytes(postData);
using (Stream dataStream = req.GetRequestStream())
{
    dataStream.Write(reqData, 0, reqData.Length);
}

var res = (HttpWebResponse)req.GetResponse();
var resStream = res.GetResponseStream();
var reader = new StreamReader(resStream);
string resString = reader.ReadToEnd();
txt1.Text = resString;

但 ImageShack 抱怨说

<links>
    <error id="parameter_missing">Sorry, but we've detected that unexpected data is received. Required parameter 'fileupload' is missing or your post is not multipart/form-data</error>
</links>

FileUpload 存在并且我正在使用multipart/form-data怎么了?

UPDATE:

新代码http://pastebin.com/TN6e0CD8 http://pastebin.com/TN6e0CD8

发布数据http://pastebin.com/fYE9fsxs http://pastebin.com/fYE9fsxs

UPDATE 2

我看了另一个问题来自 C# 客户端的多部分表单 https://stackoverflow.com/questions/219827/multipart-forms-from-c-client。用边界修改了我的代码,删除了预期的 100 标头,但我仍然无法让它工作......

ServicePointManager.Expect100Continue = false;
var boundary = "-----------------------------28520690214962";
var newLine = Environment.NewLine;
var propFormat = boundary + newLine +
                    "Content-Disposition: form-data; name=\"{0}\"" + newLine + newLine + 
                    "{1}" + newLine + newLine;
var fileHeaderFormat = boundary + newLine +
                        "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" + newLine;

var req = (HttpWebRequest)HttpWebRequest.Create("http://jm/php/upload.php");
req.Method = WebRequestMethods.Http.Post;
req.ContentType = "multipart/form-data; boundary=" + boundary;

using (var reqStream = req.GetRequestStream()) {
    var reqWriter = new StreamWriter(reqStream);
    var tmp = string.Format(propFormat, "str1", "hello world");
    reqWriter.Write(tmp);
    tmp = string.Format(propFormat, "str2", "hello world 2");
    reqWriter.Write(tmp);
    reqWriter.Write(boundary + "--");
    reqWriter.Flush();
}
var res = req.GetResponse();
using (var resStream = res.GetResponseStream()) {
    var reader = new StreamReader(resStream);
    txt1.Text = reader.ReadToEnd();
}

我终于用下面的代码得到了它......

var boundary = "------------------------" + DateTime.Now.Ticks;
var newLine = Environment.NewLine;
var propFormat = "--" + boundary + newLine +
                    "Content-Disposition: form-data; name=\"{0}\"" + newLine + newLine + 
                    "{1}" + newLine;
var fileHeaderFormat = "--" + boundary + newLine +
                        "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" + newLine;

var req = (HttpWebRequest)HttpWebRequest.Create("http://jm/php/upload.php");
req.Method = WebRequestMethods.Http.Post;
req.ContentType = "multipart/form-data; boundary=" + boundary;

using (var reqStream = req.GetRequestStream()) {
    var reqWriter = new StreamWriter(reqStream);
    var tmp = string.Format(propFormat, "str1", "hello world");
    reqWriter.Write(tmp);
    tmp = string.Format(propFormat, "str2", "hello world 2");
    reqWriter.Write(tmp);
    reqWriter.Write("--" + boundary + "--");
    reqWriter.Flush();
}
var res = req.GetResponse();
using (var resStream = res.GetResponseStream()) {
    var reader = new StreamReader(resStream);
    txt1.Text = reader.ReadToEnd();
}

注意边界必须以--{ContentType 中声明的边界} 和结束边界必须以以下开头和结尾--。就我而言,我最初使用

var propFormat = boundary + newLine +
                    "Content-Disposition: form-data; name=\"{0}\"" + newLine + newLine + 
                    "{1}" + newLine;

替换为

var propFormat = "--" + boundary + newLine +
                    "Content-Disposition: form-data; name=\"{0}\"" + newLine + newLine + 
                    "{1}" + newLine;

一切正常

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 HttpWebRequest 使用 multipart/form-data 发布数据/上传图像 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 在 C# 表单中保存和恢复应用程序设置

    我有一个基于 C 对话框的应用程序 我想保存用户选择的首选项 设置 以便我可以在下次运行时重新加载它们 我是 C 新手 可能这是非常基本的东西 但我不知道 我是否必须将它们显式写入 ini 等文件中 或者有没有内置的方法可以做到这一点 配置
  • Hibernate hbm2ddl.auto 配置的可能值是什么以及它们的作用是什么

    我真的很想了解有关更新 导出以及可以赋予的值的更多信息hibernate hbm2ddl auto我需要知道何时使用更新 何时不使用 还有什么替代方案呢 这些是数据库上可能发生的变化 新表 旧表中的新列 列已删除 列的数据类型已更改 列的类
  • CSS ul li 图像与文本对齐

    我有一个像这样的CSS ul list style image url images bulletArrow gif ul li background url images hr gif no repeat left bottom padd
  • 如果枚举无法适合整型,会发生什么情况?

    我碰到这个问题 https stackoverflow com questions 1122096 what is the underlying type of a c enum关于枚举的基础类型 其中答案引用标准 C 7 2 5 如下 枚
  • 为什么 java.util.Random 中没有接受绑定的 nextDouble()、nextFloat() 和 nextLong()

    我正在读书java util Random类并注意到没有nextDouble nextFloat and nextLong 它可以接受一个bound 有很多方法可以完成它像这样 https stackoverflow com questio
  • 为什么导出的HBase表比原来大4倍?

    我需要在更新到新版本之前备份 HBase 表 我决定使用标准将表导出到 hdfsExport http hbase apache org 0 94 book ops mgt html export工具 然后将其移动到本地文件系统 由于某种原
  • 如何对齐布局QHBoxLayout和QVBoxLayout?

    我想为我的窗口做这样的布局 所以我尝试创建一个QHBoxLayout布局放置 3 个按钮 并将其添加到QVBoxLayout usr bin python coding utf 8 import sys from PyQt4 import
  • goto 交叉初始化[重复]

    这个问题在这里已经有答案了 假设我有一些 C 代码 if error goto exit size t i 0 error size t i i 0 exit 我明白我们不应该使用goto 但仍然为什么 size t i i 0 编译而si
  • 使用 install4j 对 Linux 可执行文件进行代码签名

    我正在使用 Install4j 和 pfx 文件来为 Windows 安装程序 exe 提供数字签名 但我找不到任何方法为 Linux 安装程序 sh 提供数字签名 有什么方法可以使用 Install4j for linux 可执行文件来做
  • 如何使用javascript重置div中的滚动位置

    我正在开发移动混合应用程序 在我的 html 页面中 我有 3 个选项卡 单击选项卡时 可滚动 div 的内容会发生更改 我的问题是 当我向下滚动 div 视图 的内容并单击另一个选项卡时 内容消失 但内容在那里 请帮助我 以便我可以在单击
  • #!链接中的主题标签和感叹号作为文件夹?

    我怎样才能让我的页面像groveshark页面一样显示 http grooveshark com popular http grooveshark com popular有教程或其他东西知道如何通过 jQuery 或 JavaScript
  • 使 JList 值不可选择 [重复]

    这个问题在这里已经有答案了 我想知道如何修改JList这样单击任何值都不会执行任何操作 我看过其他问题 但没有一个有帮助 我通过使用以下类解决了这个问题 class DisabledItemSelectionModel extends De
  • Clojure 中的 = 和 ==

    在 REPL 上 如果我定义 def fits map vector take 10 iterate inc 0 然后打电话 2 nth fits 2 我变得虚假了 But 2 nth fits 2 返回真 这是预期的吗 我尝试了 clas
  • Android 蓝牙 java.io.IOException:连接被拒绝?

    我需要连接一个KwikBlue 2 模块开发套件 http www socketmobile com products embedded wireless communications kwikblue4 module 到安卓蓝牙聊天示例
  • 尝试向 Firestore 验证 Java 客户端时出现“凭据无法获取元数据”错误

    我把我的东西放在一起thought是你好世界火库Java 客户端身份验证 但它总是死掉 警告 您的应用程序已使用 Google Cloud SDK 中的最终用户凭据进行身份验证 我们建议大多数服务器应用程序使用服务帐户 如果您的应用程序继续
  • 插入 VARCHAR2 列时换行

    我有一个要求 我需要准备电子邮件数据 所以我填充将数据放入以 VARCHAR2 4000 作为定义的表列中 现在我想要的是 将其插入新行中任何我想要的位置 begin v email v email new line end 假设我正在一行
  • 使用jQuery控制视频标签

    因此 我想使用 jQuery 函数从链接的 REL 收集 URL 并将其传递给元素 收集 REL 并将其发送到 没有问题 但是从 jQuery 触发元素的加载和播放功能需要什么 这是我到目前为止所拥有的 function a compone
  • 如何在不换行的情况下执行“float: left”?

    我有一个容器box1具有一定的宽度 可能会根据其内容而变化 那个盒子里有box2它有固定的宽度 它可以是一个图标 旁边box2 我有box3带有一些文字 我希望文本使用右侧的所有可用空间box2 通过粘贴下面的 HTML 您将得到 到目前为
  • 替换先前 bash 命令中所有字符串的快捷方式

    man bash描述了一个非常有用的事件指示符 https www gnu org software bash manual bashref html Event Designators 字符串1 字符串2 快速替换 重复最后一个命令 将
  • 使用 HttpWebRequest 使用 multipart/form-data 发布数据/上传图像

    我正在尝试使用 ImageShack API 上传图像 要使用它 我应该POST图像使用multipart form data 我这样做就像 var postData var req HttpWebRequest Create http w