【问题标题】:File upload via web request doesn't work通过网络请求上传文件不起作用
【发布时间】:2012-04-04 23:22:09
【问题描述】:

对于这个标题我很抱歉,但目前我还没有足够的创造力来获得一个更好的标题。

我正在尝试将文件上传到 xup.in(在 C# 中提供一点 API)。但不知何故,该请求不是有效的。 xup.in 可以读取它,Wireshark 也可以。 Post-Request 有效,但多部分表单数据无效。

请求由以下函数发送:
http://pastebin.com/AvwzxCLA(对不起,我不能使用代码标签)

这就是我创建请求的方式:http://pastebin.com/btrg9xiZ

谁能告诉我我做错了什么?

【问题讨论】:

  • 什么错误?例外?
  • 没有错误。我刚收到 301 回复,wireshark 无法读取数据。

标签: c# file-upload httpwebrequest


【解决方案1】:

暗戳戳-边界字符串需要有一个前导--,并且消息的最后一行必须有格式:--boundarystring--,否则消息无效。维基百科上的MIME Entry 包含一个很好的例子,说明消息应该是什么样子。将请求转储到文件并确保它是有效的多部分消息是一个好的开始。

编辑

您应该真正使用System.Net.WebClient 框架,而不是您正在使用的方法。它封装了所有这些功能。

通过更改您的 mime 身体构造,我可以成功地从脚本上传。请注意,我从参数中删除了Content-Type,因为它不需要,另外我确保boundaryString 格式正确,即作为boundaryString 传入的字符串是请求标头中使用的字符串,没有领先--

我让函数执行双重任务 - 只有当 Stream 是 null 时它才会计算大小。

    public static long sendMultiPartReq(Stream req, string boundaryString, object[] files, object[] parameters)
    {
        String CRLF = "\r\n";
        byte[] b;
        long contentLength = 0;

        foreach (string[] file in files)
        {
            b = Encoding.UTF8.GetBytes(
                CRLF + "--" + boundaryString + CRLF +
                String.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" + CRLF,
                    file[0], Path.GetFileName(file[1])) +
                "Content-Type: image/png" + CRLF + CRLF);
            contentLength += b.LongLength;
            if (req != null) req.Write(b, 0, b.Length);
            if (File.Exists(file[1]))
            {
                b = File.ReadAllBytes(file[1]);
                contentLength += b.LongLength;
                if (req != null) req.Write(b, 0, b.Length);
            }
            b = Encoding.UTF8.GetBytes(CRLF);
            contentLength += b.LongLength;
            if (req != null) req.Write(b, 0, b.Length);
        }
        foreach (string[] parameter in parameters)
        {
            b = Encoding.UTF8.GetBytes(
                "--" + boundaryString + CRLF +
                String.Format("Content-Disposition: form-data; name=\"{0}\"" + CRLF, parameter[0]) +
                CRLF + parameter[1] + CRLF);
            contentLength += b.LongLength;
            if (req != null) req.Write(b, 0, b.Length);
        }
        b = Encoding.UTF8.GetBytes("--" + boundaryString + "--" + CRLF);
        contentLength += b.LongLength;
        if (req != null) req.Write(b, 0, b.Length);
        return contentLength;
    }

【讨论】:

  • 不错的尝试我真的忘记了最后一个边界,但这不是错误。无论如何,同样的问题:(。更新代码:pastebin.com/AvwzxCLA
猜你喜欢
  • 1970-01-01
  • 2014-07-19
  • 2013-01-05
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多