使用 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 发布数据/上传图像 的相关文章

随机推荐

  • 在 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