Google云端硬盘:转换不起作用

时间:2015-07-11 09:46:04

标签: vb.net rest google-drive-api drive

我使用G Drive REST端点(不是.net客户端)通过vb .net上传docx文件。我的问题是,即使我将查询参数“convert”声明为true,文件也会上传,但它们永远不会自动转换。 我要做的第一件事就是使用POST创建一个新文件,然后在单独的请求中使用Put in upload uri上传内容。

当我使用Google Playground上传docx文件时,它甚至无效。

      Public Shared Function UploadStream(fileStream As IO.Stream, filename As String, mimetype As String, target As String, accesstoken As String, Optional ConvertToGDoc As Boolean = False) As String
    Try

        Dim subject As String = ""
        Dim doc As New Aspose.Words.Document
        Dim docformat = Aspose.Words.FileFormatUtil.DetectFileFormat(fileStream) ' detect the format of the file Then 'check if the file is doc or docx
        If docformat.LoadFormat = Aspose.Words.LoadFormat.Doc Or docformat.LoadFormat = Aspose.Words.LoadFormat.Docx Then 'check if the file is word document
            doc = New Aspose.Words.Document(fileStream)
            subject = doc.BuiltInDocumentProperties.Subject 'get the subject from the word file
            If doc.BuiltInDocumentProperties.Subject = "" Then subject = "none"
        Else
            subject = "none" 'set the subject as none if the file is not word file
        End If

        Dim localmd5 = Files.MD5stream(fileStream)

        Dim baseaddress = "https://www.googleapis.com/drive/v2/files?convert=" + ConvertToGDoc.ToString
        Dim req = Net.HttpWebRequest.Create(baseaddress)
        req.Method = "POST"
        req.Headers.Add("Authorization", "Bearer " + System.Web.HttpUtility.UrlEncode(accesstoken))
        req.ContentType = "application/json"

        Dim writer = New Newtonsoft.Json.Linq.JTokenWriter()
        writer.WriteStartObject()
        writer.WritePropertyName("title")
        writer.WriteValue(filename)

        writer.WritePropertyName("parents")
        writer.WriteStartArray()
        writer.WriteRawValue("{'id':'" + target + "'}")
        writer.WriteEndArray()
        writer.WritePropertyName("properties")
        writer.WriteStartArray()
        writer.WriteRawValue("{'key':'Subject','value':'" + subject + "'},{'key':'MD5','value':'" + localmd5 + "'},{'key':'Author','value':''}")
        writer.WriteEndArray()
        writer.WriteEndObject()

        Dim bodybytes = Text.Encoding.UTF8.GetBytes(writer.Token.ToString)
        req.ContentLength = bodybytes.Length

        Dim requestStream = req.GetRequestStream
        requestStream.Write(bodybytes, 0, bodybytes.Length)
        requestStream.Close()

        Dim resp As System.Net.HttpWebResponse = req.GetResponse()
        Dim response = New IO.StreamReader(resp.GetResponseStream, False).ReadToEnd
        Dim json As Newtonsoft.Json.Linq.JObject
        json = Newtonsoft.Json.Linq.JObject.Parse(response)
        Dim fileId = json.SelectToken("id").ToString()

        baseaddress = "https://www.googleapis.com/upload/drive/v2/files/" + fileId + "?uploadType=media&convert=" + ConvertToGDoc.ToString
        req = Net.HttpWebRequest.Create(baseaddress)
        req.Method = "Put"
        req.Headers.Add("Authorization", "Bearer " + System.Web.HttpUtility.UrlEncode(accesstoken))
        bodybytes = General.GetStreamAsByteArray(fileStream)

        req.ContentLength = bodybytes.Length

        req.ContentType = mimetype

        requestStream = req.GetRequestStream
        requestStream.Write(bodybytes, 0, bodybytes.Length)
        requestStream.Close()
        resp = req.GetResponse()
        response = New IO.StreamReader(resp.GetResponseStream, False).ReadToEnd

        Return fileId
    Catch ex As Exception
        Return Nothing
    End Try
End Function

Shared Function GetStreamAsByteArray(ByVal stream As System.IO.Stream) As Byte()
    Dim streamLength As Integer = Convert.ToInt32(stream.Length)

    Dim fileData As Byte() = New Byte(streamLength) {}
    stream.Position = 0
    ' Read the file into a byte array  
    stream.Read(fileData, 0, streamLength)

    stream.Close()
    ReDim Preserve fileData(fileData.Length - 2)
    Return fileData


End Function

 Public Shared Function MD5stream(ByVal File_stream As IO.Stream, Optional ByVal Seperator As String = Nothing) As String
    Using MD5 As New System.Security.Cryptography.MD5CryptoServiceProvider
        Dim Hash() As Byte = MD5.ComputeHash(File_stream)
        Return Replace(BitConverter.ToString(Hash), "-", Seperator)
    End Using
End Function

还有其他人有同样的问题吗?

0 个答案:

没有答案