使用REST WebService和VB.NET的附件 [英] Attachments using REST WebService and VB.NET

查看:182
本文介绍了使用REST WebService和VB.NET的附件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在使用VB.NET开发一个应用程序,其中正在使用REST WebServices.我已经能够使用REST进行基础操作,但是,我无法添加附件(更具体地说,是使用获得附件的REST上传文件).我已经在网上进行了广泛的研究,但是到目前为止,我还无法在VB.NET中找到任何有效的示例.要实际上传数据,我使用System.Net.WebClient.以下VB.NET代码完成了重要工作:

I am currently developing an application using VB.NET in which I am using the REST WebServices. I have been able to do the basics with REST, however, I have not been able to add an attachment (more specifically upload a file, using REST which gets attached). I have done extensive research online, but so far I have not been able to find any working examples in VB.NET. To actually upload the data I use System.Net.WebClient. The following VB.NET code does the important work:

Dim Client As New System.Net.WebClient
Dim postBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(postString)
Client.UploadData(URL, "POST", postBytes)

我的URL的简化版本如下: "../REST/1.0/ticket/" + ticketNumber + "/comment?user=" + userName + "&pass=" + password

A simplified version of my URL is as follows: "../REST/1.0/ticket/" + ticketNumber + "/comment?user=" + userName + "&pass=" + password

最后,我发布的内容示例为:

Finally, an example of the content that I post is:

postString = "content=Text: RT Test" + vbLf + "Action: Comment" + vbLf + "Attachment: examplefile.jpg" + vbLf + "attachment_1="

如您所见,postString转换为字节,然后上载到服务器.但是,我不知道应在何处或如何发布原始附件本身.我们专门针对服务的文档使用状态来使用变量"attachment_1",该变量已添加到postString变量中,但是我不确定下一步应该是什么.是否应该将文件转换为字节并附加到postBytes变量?我尝试过类似的操作,但收到一条错误消息,说没有找到examplefile.jpg的附件.

As you can see, the postString is converted to bytes and then uploaded to the server. However, I do not know where or how I should be posting the raw attachment itself. The documentation for the service we are specifically using states to use a variable "attachment_1," which I added to the postString variable, but I am not sure what the next step should be. Should the file be converted into bytes and appended to the postBytes variable? I attempted something like this but I received an error saying that no attachment was found for examplefile.jpg.

感谢您的帮助!

推荐答案

我们无法使用Client.UploadData(...),不得不将整个帖子转换为字节,从附件之前的POST字段开始,然后附件本身,最后是POST字段的其余部分.

We could not use Client.UploadData(...) and had to convert the entire post to bytes, starting with the POST fields before the attachment, then the attachment itself, and finally the remainder of the POST fields.

Public Sub AddAttachmentToRT(ByVal url As String, ByVal fileName As String, ByVal filePath As String)

    Dim dataBoundary As String = "--xYzZY"
    Dim request As HttpWebRequest
    Dim fileType As String = "image/jpeg" 'Will want to extract this to make it more generic from the uploaded file.

    'Create a POST web request to the REST interface using the passed URL
    request = CType(WebRequest.Create(url), HttpWebRequest)
    request.ContentType = "multipart/form-data; boundary=xYzZY"
    request.Method = "POST"
    request.KeepAlive = True

    'Write the request to the requestStream
    Using requestStream As IO.Stream = request.GetRequestStream()

        'Create a variable "attachment_1" in the POST, specify the file name and file type
        Dim preAttachment As String = dataBoundary + vbCrLf _
        + "Content-Disposition: form-data; name=""attachment_1""; filename=""" + fileName + """" + vbCrLf _
        + "Content-Type: " + fileType + vbCrLf _
        + vbCrLf

        'Convert this preAttachment string to bytes
        Dim preAttachmentBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(preAttachment)

        'Write this preAttachment string to the stream
        requestStream.Write(preAttachmentBytes, 0, preAttachmentBytes.Length)

        'Write the file as bytes to the stream by passing its exact location
        Using fileStream As New IO.FileStream(Server.MapPath(filePath + fileName), IO.FileMode.Open, IO.FileAccess.Read)

            Dim buffer(4096) As Byte
            Dim bytesRead As Int32 = fileStream.Read(buffer, 0, buffer.Length)

            Do While (bytesRead > 0)

                requestStream.Write(buffer, 0, bytesRead)
                bytesRead = fileStream.Read(buffer, 0, buffer.Length)

            Loop

        End Using

        'Create a variable named content in the POST, specify the attachment name and comment text
        Dim postAttachment As String = vbCrLf _
        + dataBoundary + vbCrLf _
        + "Content-Disposition: form-data; name=""content""" + vbCrLf _
        + vbCrLf _
        + "Action: comment" + vbLf _
        + "Attachment: " + fileName + vbCrLf _
        + "Text: Some description" + vbCrLf _
        + vbCrLf _
        + "--xYzZY--"

        'Convert postAttachment string to bytes
        Dim postAttachmentBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(postAttachment)

        'Write the postAttachment string to the stream
        requestStream.Write(postAttachmentBytes, 0, postAttachmentBytes.Length)

    End Using

    Dim response As Net.WebResponse = Nothing

    'Get the response from our REST request to RT
    'Required to capture response, without this Try-Catch attaching will fail
    Try
        response = request.GetResponse()

        Using responseStream As IO.Stream = response.GetResponseStream()

            Using responseReader As New IO.StreamReader(responseStream)

                Dim responseText = responseReader.ReadToEnd()

            End Using

        End Using

    Catch exception As Net.WebException

        response = exception.Response

        If (response IsNot Nothing) Then

            Using reader As New IO.StreamReader(response.GetResponseStream())

                Dim responseText = reader.ReadToEnd()

            End Using

            response.Close()

        End If

    Finally

        request = Nothing

    End Try

End Sub

这篇关于使用REST WebService和VB.NET的附件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆