【问题标题】:Upload file to Mediafire with C#使用 C# 将文件上传到 Mediafire
【发布时间】:2016-02-02 08:22:14
【问题描述】:

我在Mediafire developers 部分阅读了很多内容,但似乎没有为 C# 开发人员提供库,所以我尝试使用他们的 Web 服务 API

上传文件的正常场景如下:

1- 通过此链接请求session_token

https://www.mediafire.com/api/user/get_session_token.php?email={0}&password={1}&application_id={2}&signature={3}&token_version=2


这一步工作正常,我得到session_token
之后,您在 post 请求中使用 session_token 通过此链接上传文件

 http://www.mediafire.com/api/unversioned/upload/simple.php?uploadkey={0}&session_token={1}

Mediafire 文档描述 Raw HTTP Request 用于上传:

POST http://www.mediafire.com/api/unversioned/upload/simple.php?uploadkey=5bb66g94blnnk&session_token=aa22f5a968f827daf69fd6b3515110c43e036bc5d2ed8b81657dd1bdfe4b4c3e3ea6757d1f47bc3d6a001a16bc6f25abb486c5e779328a5769bd9ed6064edb69 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
X-Filehash:564dc5e9541a494e966066da8b2392e2e70e2438e4fcf4b0058cd9249abc4e1d
X-Filesize:29278
X-Filetype:text/plain
Content-Type: multipart/form-data; boundary=---------------------------41184676334
Content-Length: 29278

-----------------------------41184676334


Summer vacation
-----------------------------41184676334
Content-Disposition: form-data; name="image1"; filename="GrandCanyon.jpg"
Content-Type: image/jpeg

(Binary data not shown)
-----------------------------41184676334--

我尝试做HttpWebRequest,但它不起作用

    byte[] postData = File.ReadAllBytes(@"img2.jpg");

    System.Net.ServicePointManager.Expect100Continue = false;
    System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)WebRequest.Create("http://www.mediafire.com/api/1.1/upload/upload.php?uploadkey=3kh445&session_token=" + respon.session_token);
    request.Method = "POST";
    request.Headers.Clear();
    request.UserAgent = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0";
    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";

    request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-us,en;q=0.5");
    request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
    request.ContentType = "multipart/form-data";
    request.ContentLength = postData.Length;

    Stream requestStream = request.GetRequestStream();
    requestStream.Write(postData, 0, postData.Length);
    requestStream.Flush();
    requestStream.Close();

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();


此代码抛出异常:

The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF


我也尝试了这段代码,它的保留请求没有响应:

string path = String.Format("http://www.mediafire.com/api/unversioned/upload/simple.php?uploadkey=3kh5656&session_token={0}", respon.session_token);

            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            string http = string.Format(
                        @"
POST {0} HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
X-Filehash:{1}
X-Filesize:{2}
X-Filetype:text/plain
Content-Type: multipart/form-data; boundary=---------------------------{6}
Content-Length: {3}

-----------------------------{6}


Summer vacation
-----------------------------{6}
Content-Disposition: form-data; name=""image1""; filename=""{4}""
Content-Type: image/jpeg

{5}
-----------------------------{6}--"
                        ,
                        path, 
                        GetFileHash(@"img2.jpg"), 
                        file.Length,
                        file.LongLength, 
                        filename, 
                        Encoding.Default.GetString(file),
                        DateTime.Now.Ticks.ToString("x")
                        );

            sock.Connect(new IPAddress(Dns.GetHostEntry("www.mediafire.com").AddressList[0].GetAddressBytes()), 80);
            sock.Send(Encoding.Default.GetBytes(http));

            while (sock.Available == 0)
                Thread.Sleep(1);


            file = new byte[sock.Available];
            sock.Receive(file, 0, sock.Available, SocketFlags.None);
            string result = Encoding.ASCII.GetString(file);
            sock.Close();

抱歉英语不好有不清楚的地方请告诉我我会编辑问题。

【问题讨论】:

  • 根据错误,调试您的http 字符串并确保您的换行符是\r\n 而不仅仅是\r

标签: c# sockets httprequest mediafire


【解决方案1】:

艾哈迈德,

我确实看到了一些问题。不过,MediaFire 的文档似乎也需要更多更新。

在您的第一个示例中,您使用的网址是 http://www.mediafire.com/api/1.1/upload/upload.php?uploadkey=3kh445&session_token= 。我想指出几点:

  1. upload/upload.php 在旧版 API 中已弃用,因此您无法在 v1.1 中使用该 API。您需要使用upload/simple.php、upload/patch.php、upload/instant.php、upload/resumable.php 或upload/update.php。
  2. 'Uploadkey' 不是任何上传 API 的参数。这是与 poll_upload.php 一起使用的上传 API 的响应。

我发现那里的 MediaFire 文档有误,让您感到困惑。所以,你的 URL 应该看起来更接近这个:http://www.mediafire.com/api/1.1/upload/simple.php?session_token=

另外需要注意的是,只有文件的二进制数据应该在帖子正文中。即使请求类型是 POST,对于 MediaFire 上传 API,任何其他参数都将位于 URL 查询字符串中(除非该参数位于 Header Data 下)。因此,session_token、signature、filedrop_key、path、action_on_duplicate 和 mtime 将始终位于 URL 的查询字符串部分。

我看到,在您的 XMLHTTPRequest 示例中,您按照应有的方式添加了 Content-Type=multipart/form-data 标头,但其中缺少边界信息。您发布的第二个未返回响应的示例具有格式正确的 Content-Type + 边界,但看起来您将其余参数放入 POST 正文而不是 URL 查询字符串。

最后一个例子看起来也有一个格式错误的 URL。如果您调用的是旧版 MediaFire API,您只需使用 www.mediafire.com/api/api 类别/api 名称.php,例如 www.mediafire。 com/api/upload/simple.php。如果您需要调用版本化 API,您需要将版本添加到 URL www.mediafire.com/api/版本号/api 类别/api 名称.php,如www.mediafire.com/api/1.1/upload/simple.php。

【讨论】:

    【解决方案2】:

    MediaFire 最近在 Github 上发布了一个 C# SDK:

    https://github.com/MediaFire/mediafire-csharp-open-sdk

    在 Visual Studio 中,您还可以通过在包管理器控制台中输入以下命令使用 NuGet 安装它:

    安装包 MediaFireSDK

    在 GitHub 自述文件中,您将找到如何上传文件的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      相关资源
      最近更新 更多