2011-05-26 32 views
1

我目前正在开发一个使用VB.NET的应用程序,其中使用了REST WebServices。我已经能够使用REST完成基础知识,但是,我无法添加附件(更具体地说,上传文件,使用附加的REST)。我在网上做了大量的研究,但到目前为止,我还没有能够在VB.NET中找到任何工作示例。要真正上传我使用System.Net.WebClient的数据。下面的VB.NET代码做的重要工作:使用REST WebService和VB.NET的附件

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

最后,我发布的内容的一个例子是:

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

正如你所看到的,postString被转换为字节,然后上传到服务器。但是,我不知道应该在哪里或如何发布原始附件本身。我们特别使用的服务的文档声明使用变量“attachment_1”,该变量添加到postString变量中,但我不确定下一步应该是什么。该文件应该转换为字节并附加到postBytes变量?我尝试过这样的事情,但我收到一个错误消息,说没有找到examplefile.jpg的附件。

感谢您的帮助!

+0

您是否试过Base64编码数据? 'Convert.ToBase64String(bytes)' – 2011-05-26 17:09:13

+0

感谢您的建议。似乎没有为我工作,但是,你怎么实际添加附件?我们正在浏览REST界面,所以在我们去的URL的末尾:“URL \ content = ...附件:filename.xtension操作:评论.... attachment_1 =”+ Convert.ToBase64String(FileAsBytes(文件) )其中FileAsBytes()是一个函数,可以将附件文件转换为字节,但是,响应会回到:“...错误的请求...”,无法记住部分的确切语句,因为现在不工作,任何建议或更精确的细节?谢谢。 – Devin 2011-06-05 04:14:41

回答

0

我们无法使用Client.UploadData(...),必须将整个帖子转换为字节,从附件前的POST字段开始,然后是附件本身,最后是剩余的POST字段。

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