使用VB.NET上传到Imageshack

时间:2010-09-01 00:38:37

标签: .net vb.net httpwebrequest

我想使用http://www.imageshack.us/upload_api.php API函数将图片上传到ImageShack,然后获取image_link。唯一的问题是,如何将带有文件名的图像与表单数据和API密钥一起放置?这就是我试图实现这个功能的原因。

顺便说一下,OpenDialog已经实施,可以选择要上传的文件。

更新:我尝试调整现有代码以使用Unified API,但仍然无效。如果有人知道代码中有什么问题,只需进行修改......否则,我会研究另一种解决方案。

Imports System.Xml
Imports System.Xml.Serialization
Imports System.Xml.XPath

Public Class ImageShackUploader

    Structure ReturnedURLs
        Dim DirectLinkURL As String
        Dim yflogURL As String
        Dim ThumbnailURL As String
        Dim Exitoso As Boolean
    End Structure

    Private Function GetReturnedURLsFromXMLRta(ByVal XML As String)
        'Intitalize new XmlDocument
        Dim xmlDoc As New XmlDocument

        'Read XML from the string provided
        xmlDoc.LoadXml(XML)

        'Instantiate the XPathNavigator class.
        Dim xmlNav As System.Xml.XPath.XPathNavigator = xmlDoc.CreateNavigator()

        'XPath
        Dim xmlNI As XPathNodeIterator

        'Select XPath
        xmlNI = xmlNav.Select("//links")

        Dim RtaURLs As New ReturnedURLs
        RtaURLs.Exitoso = True
        'Get the URLs
        While (xmlNI.MoveNext())
            Select Case xmlNI.Current.Name
                Case "image_link"
                    RtaURLs.DirectLinkURL = xmlNI.Current.Value
                    MsgBox("Direct Link: " + xmlNI.Current.Value)
                Case "thumb_link"
                    RtaURLs.ThumbnailURL = xmlNI.Current.Value
                    MsgBox("Thumbnail Link: " + xmlNI.Current.Value)
                Case "yfrog_link"
                    RtaURLs.yflogURL = xmlNI.Current.Value
                    MsgBox("yFlog Link: " + xmlNI.Current.Value)
            End Select
        End While

        Return RtaURLs

    End Function
    Public Function UploadFileToImageShack(ByVal FileName As String) As ReturnedURLs
        Dim OldValue As Boolean = System.Net.ServicePointManager.Expect100Continue

        Try
            System.Net.ServicePointManager.Expect100Continue = False
            '1. Cookie
            Dim Cookie As New Net.CookieContainer()

            '2. Arguments
            Dim QueryStringArguments As New Dictionary(Of String, String)
            QueryStringArguments.Add("rembar", "1")
            QueryStringArguments.Add("key", "")

            '3. contentType
            Dim ContentType As String = ""
            Select Case IO.Path.GetExtension(FileName).ToLower
                Case ".jpg"
                    ContentType = "image/jpeg"
                Case ".jpeg"
                    ContentType = "image/jpeg"
                Case ".gif"
                    ContentType = "image/gif"
                Case ".png"
                    ContentType = "image/png"
                Case ".bmp"
                    ContentType = "image/bmp"
                Case ".tif"
                    ContentType = "image/tiff"
                Case ".tiff"
                    ContentType = "image/tiff"
                Case Else
                    ContentType = "image/unknown"
            End Select

            '4. Upload and return Rta
            Return GetReturnedURLsFromXMLRta(UploadFileEx(FileName, "http://www.imageshack.us/upload_api.php", "fileupload", ContentType, QueryStringArguments, Cookie))
        Catch ex As Exception
            Dim Rta As New ReturnedURLs
            Rta.Exitoso = False
            Return Rta
        Finally
            System.Net.ServicePointManager.Expect100Continue = OldValue
        End Try
    End Function


    Private Function UploadFileEx(ByVal FileName As String, ByVal URL As String, ByVal FileFormName As String, ByVal ContentType As String, ByVal QueryStringArguments As Dictionary(Of String, String), ByVal Cookies As Net.CookieContainer) As String
        If FileFormName = "" Then FileFormName = "file"
        If ContentType = "" Then ContentType = "application/octet-stream"

        Dim PostData As String = "?"
        If QueryStringArguments IsNot Nothing Then
            For Each kvp As KeyValuePair(Of String, String) In QueryStringArguments
                PostData &= kvp.Key & "=" & kvp.Value & "&"
            Next
        End If


        Dim URI As New Uri(URL + PostData)
        Dim Boundary As String = "----------" + DateTime.Now.Ticks.ToString("x")
        Dim WReq As Net.HttpWebRequest = DirectCast(Net.WebRequest.Create(URI), Net.HttpWebRequest)
        WReq.CookieContainer = Cookies
        WReq.ContentType = "multipart/form-data; boundary=" + Boundary
        WReq.Method = "POST"

        Dim PostHeader As String = String.Format("--" & Boundary & "{0}" & _
        "Content-Disposition: form-data; name=""" & FileFormName _
        & """; fileupload=""" & IO.Path.GetFileName(FileName) & """{0}" _
        & "Content-Type: " & ContentType & "{0}{0}", vbNewLine)

        Dim PostHeaderBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(PostHeader)
        Dim BoundaryBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(vbNewLine & "--" + Boundary + vbNewLine)

        Dim FileStream As New IO.FileStream(FileName, IO.FileMode.Open, IO.FileAccess.Read)

        WReq.ContentLength = PostHeaderBytes.Length + FileStream.Length + BoundaryBytes.Length

        Dim RequestStream As IO.Stream = WReq.GetRequestStream()
        RequestStream.Write(PostHeaderBytes, 0, PostHeaderBytes.Length)
        Dim buffer As Byte() = New Byte(CInt(Math.Min(4096, CInt(FileStream.Length))) - 1) {}
        Dim bytesRead As Integer = 0
        Do
            bytesRead = FileStream.Read(buffer, 0, buffer.Length)
            If bytesRead = 0 Then Exit Do
            RequestStream.Write(buffer, 0, bytesRead)
        Loop
        RequestStream.Write(BoundaryBytes, 0, BoundaryBytes.Length)
        RequestStream.Flush()
        RequestStream.Close()
        Dim Rta As Net.WebResponse = WReq.GetResponse()
        Dim s As IO.Stream = Rta.GetResponseStream()
        Dim sr As New IO.StreamReader(s)
        FileStream.Close()
        Return sr.ReadToEnd()
    End Function

End Class

1 个答案:

答案 0 :(得分:0)

将此库与API一起使用,将图像上传到ImageShack。

.NET Wrapper For ImageShack XML API。它基本上会照顾你所有的一切。调整大小,API密钥,cookie,一切。只需添加对提供的程序集的引用,然后通过VB调用它。甚至还提供了一个演示客户端。

否则:在ASP.NET论坛上查看此解决方案 - Upload Images to ImageShack on ASP.NET forums。代码在C#中,但很容易移植到VB.NET。