Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C将文件上载到Mediafire#_C#_Sockets_Httprequest_Mediafire - Fatal编程技术网

C# 使用C将文件上载到Mediafire#

C# 使用C将文件上载到Mediafire#,c#,sockets,httprequest,mediafire,C#,Sockets,Httprequest,Mediafire,我在第节中读了很多,但似乎它们不是为C#开发者提供的库,所以我尝试使用他们的web服务API 上传文件的正常情况如下: 1-通过此链接请求会话令牌 https://www.mediafire.com/api/user/get_session_token.php?email={0}&password={1}&application_id={2}&signature={3}&token_version=2 http://www.mediafire.com/api/

我在第节中读了很多,但似乎它们不是为C#开发者提供的库,所以我尝试使用他们的web服务API

上传文件的正常情况如下:

1-通过此链接请求会话令牌

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

这一步很好,我得到了
session\u令牌

之后,您可以在post请求中使用
会话\u令牌
,通过此链接上载文件

https://www.mediafire.com/api/user/get_session_token.php?email={0}&password={1}&application_id={2}&signature={3}&token_version=2
 http://www.mediafire.com/api/unversioned/upload/simple.php?uploadkey={0}&session_token={1}
Mediafire文档描述了如何上传:

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

我也尝试了这个代码,它的keep请求没有响应:

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();
对不起,英语不好,有什么不清楚的请告诉我,我会编辑这个问题。

艾哈迈德

我确实觉得有两件事不对。不过,看起来MediaFire的文档还需要进一步更新

在第一个示例中,您使用的url是。我想指出几点:

  • 该upload/upload.php在旧版API中已被弃用,因此您不能在v1.1中使用该API。您需要使用upload/simple.php、upload/patch.php、upload/instant.php、upload/resubable.php或upload/update.php
  • “Uploadkey”不是任何上载API的参数。这是用于poll_upload.php的上传API的响应
  • 我发现MediaFire文档是错误的,让您感到困惑。因此,您的URL应该更接近以下内容:

    另一件需要注意的事情是,只有文件的二进制数据应该在post正文中。即使请求类型为POST,对于MediaFire上载API,任何其他参数都将位于URL查询字符串中(除非该参数位于标题数据下)。因此,会话\u令牌、签名、文件删除\u密钥、路径、重复操作\u和mtime将始终位于URL的查询字符串部分

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


    最后一个示例看起来也有一个错误的URL。如果要调用MediaFire API的旧版本,只需使用www.MediaFire.com/API/API category/API name.php,如www.MediaFire.com/API/upload/simple.php。如果需要调用版本化的API,则需要将该版本添加到URL www.mediafire.com/API/version number/API category/API name.php,例如www.mediafire.com/API/1.1/upload/simple.php。

    mediafire最近发布了一个C#SDK,可在Github上获得,网址为:

    在Visual Studio中,您还可以通过在package manager控制台上键入以下命令,使用NuGet安装它:

    安装MediaFireSDK包


    在GitHub自述文件中,您可以找到如何上载文件的示例。

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