用C#将文件上传到Mediafire
本文关键字:Mediafire 文件 | 更新日期: 2023-09-27 18:22:00
我在Mediafire开发者部分读了很多书,但似乎他们没有为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
之后,您在发布请求中使用session_token
通过此链接上传文件
http://www.mediafire.com/api/unversioned/upload/simple.php?uploadkey={0}&session_token={1}
Mediafire文档描述了原始HTTP上传请求:
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();
很抱歉英语不好,有什么不清楚的地方请告诉我,我会编辑这个问题。
Ahmed,
我确实看到了一些错误。看起来MediaFire的文档也需要更多的更新。
在您的第一个示例中,您使用的url是http://www.mediafire.com/api/1.1/upload/upload.php?uploadkey=3kh445&session_token=。我想指出几点:
- upload/upload.php在API的旧版中已被弃用,因此您不能在v1.1中使用该API。您需要使用upload/simple.php、upload/patch.php、upload/instant.php、upload/resumable.php或upload/update.php
- "Uploadkey"不是任何上传API的参数。这是将与poll_upload.php一起使用的上传API的响应
我发现MediaFire的文档是错误的,这让你很困惑。因此,您的URL应该看起来更接近以下内容:http://www.mediafire.com/api/1.1/upload/simple.php?session_token=
另一件需要注意的事情是,只有文件的二进制数据应该在post正文中。即使请求类型是POST,对于MediaFire上传API,任何其他参数都将在URL查询字符串中(除非该参数位于Header Data下)。因此,session_token、signature、filedrop_key、path、action_on_duplicate和mtime将始终位于URL的查询字符串部分。
我在XMLHTTPRequest示例中看到,您添加了Content-Type=multipart/form数据头,但其中缺少边界信息。您发布的第二个没有返回响应的示例有一个格式正确的Content-Type+边界,但看起来您将其余参数放入POST主体,而不是URL查询字符串。
最后一个例子看起来也有一个格式错误的URL。如果您正在调用MediaFire API的旧版本,只需使用www.MediaFire.com/API/API类别/API名称.php,如www.MediaFire.com/sapi/upload/simple.php。如果您需要调用版本化的API,则需要将版本添加到URL www.MediaFire.com/API/1版本号/API类别/2 API名称.php,例如www.mediafire.com/api/1.1/upload/simple.php.
MediaFire最近在Github上发布了一个C#SDK:
https://github.com/MediaFire/mediafire-csharp-open-sdk
在Visual Studio中,您也可以通过在包管理器控制台上键入以下命令将其与NuGet一起安装:
安装包MediaFireSDK
在GitHub自述文件中,您可以找到如何上传文件的示例。