C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

バイナリファイル⇒元データファイルへの復元方法(VB.net /なす (20/02/14(Fri) 10:45) #93864
Re[1]: バイナリファイル⇒元データファイルへの復元方法(VB... /魔界の仮面弁士 (20/02/14(Fri) 11:29) #93866
Re[1]: バイナリファイル⇒元データファイルへの復元方法(VB... /Hongliang (20/02/14(Fri) 11:20) #93865
  └ Re[2]: バイナリファイル⇒元データファイルへの復元方法(VB... /なす (20/02/14(Fri) 11:31) #93867 解決済み


親記事 / ▼[ 93866 ] ▼[ 93865 ]
■93864 / 親階層)  バイナリファイル⇒元データファイルへの復元方法(VB.net
□投稿者/ なす (1回)-(2020/02/14(Fri) 10:45:09)

分類:[.NET 全般] 

分類:[Vb.net]

アプリケーションを使用してアップロードしたファイルを、下記の添付ファイルダウンロードAPIを使用してバイナリデータ取得まで出来ました。
https://sites.google.com/a/sateraito.jp/nextset-dounyuu/Home/wakufuro-ji-neng/api#TOC-API3

それを元データに変換(ExcelやPDF)しようとしています。しかし、上手くいきません。。
下記コードだとファイルは作成されるのですが、PDFだと真っ白。Excelだと破損ファイルになります。

なんとかならないでしょうか?

   Private Sub fileDownload(ByVal doc_id As String, ByVal file As JSONRowFile, ByVal token As String)

        'POST送信する文字列を作成
        Dim postData As String = _
                "access_token=" + token + "&" + IMPERSONATE_EMAIL + "&" + APPLICATION_ID + "&doc_id=" + doc_id + "&file_id=" + file.file_id

        'バイト型配列に変換
        Dim postDataBytes As Byte() = _
            System.Text.Encoding.ASCII.GetBytes(postData)

        'WebRequestの作成
        Dim req As System.Net.WebRequest = _
            System.Net.WebRequest.Create("https://workflow.nextset.jp/optex/api/public/attach/download")
        'メソッドにPOSTを指定
        req.Method = "POST"
        'ContentTypeを"application/x-www-form-urlencoded"にする
        req.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"
        'POST送信するデータの長さを指定
        req.ContentLength = postDataBytes.Length

        'データをPOST送信するためのStreamを取得
        Dim reqStream As System.IO.Stream = req.GetRequestStream()
        '送信するデータを書き込む
        reqStream.Write(postDataBytes, 0, postDataBytes.Length)
        reqStream.Close()

        'サーバーからの応答を受信するためのWebResponseを取得
        Dim res As System.Net.WebResponse = req.GetResponse()
        '応答データを受信するためのStreamを取得
        Dim resStream As System.IO.Stream = res.GetResponseStream()
        '受信して表示
        Using sr As New System.IO.StreamReader(resStream, ENC)
            Dim str = sr.ReadToEnd
            Dim bs As Byte() 'バイト配列

            bs = Encoding.GetEncoding("UTF-8").GetBytes(str) 'shift_jis
            bs = Encoding.UTF8.GetBytes(str) 'utf-8
            Try
                Dim fs As New FileStream("C:\Users\[秘密]\Desktop\btest\" + file.file_name, FileMode.Create)
                Dim bw As New BinaryWriter(fs)
                bw.Write(CType(bs, Byte()))
                bw.Close()
                fs.Close()
            Catch ex As IOException
                Debug.Write(ex.Message)
            End Try


        End Using

        Return

    End Sub

以上、よろしくお願い致します。

[ □ Tree ] 返信 編集キー/

▲[ 93864 ] / 返信無し
■93866 / 1階層)  Re[1]: バイナリファイル⇒元データファイルへの復元方法(VB.net
□投稿者/ 魔界の仮面弁士 (2555回)-(2020/02/14(Fri) 11:29:58)
No93864 (なす さん) に返信
> System.Net.WebRequest.Create("https://workflow.nextset.jp/optex/api/public/attach/download")

/attach/download API が返す内容は、生のバイナリデータのようですね。

>> ※本APIはJSON形式のResponseデータではなく、ファイルストリームデータを返します。
>> また、結果は、HTTPステータスにて返ります。



> 下記コードだとファイルは作成されるのですが、PDFだと真っ白。Excelだと破損ファイルになります。
> Using sr As New System.IO.StreamReader(resStream, ENC)
>  Dim str = sr.ReadToEnd
>  bs = Encoding.GetEncoding("UTF-8").GetBytes(str) 'shift_jis

なぜ、String 型の変数に受け取っているのでしょうか?

サーバーから得られたバイナリ → ENC 指定で文字列化 → その文字列を GetEncoding("UTF-8") で UTF-8 バイナリ化

ではなく

サーバーから得られたバイナリ → それをそのままファイルに保存

で良いと思うのですが…。
[ 親 93864 / □ Tree ] 返信 編集キー/

▲[ 93864 ] / ▼[ 93867 ]
■93865 / 1階層)  Re[1]: バイナリファイル⇒元データファイルへの復元方法(VB.net
□投稿者/ Hongliang (960回)-(2020/02/14(Fri) 11:20:43)
2020/02/14(Fri) 11:20:58 編集(投稿者)
> Using sr As New System.IO.StreamReader(resStream, ENC)
>     Dim str = sr.ReadToEnd

元々のファイルがENCでエンコードされたテキストファイルでない限り、
この方法ではデータが破損します。
直接ファイルにダウンロードするなら、以下のようにします。
Using fs As New FileStream(ファイルパス, FileMode.Create)
    resStream.CopyTo(fs)
End Using

StreamReaderはテキストデータにのみ使用できます。
ExcelファイルにせよPDFファイルにせよ、テキストデータではありません。

[ 親 93864 / □ Tree ] 返信 編集キー/

▲[ 93865 ] / 返信無し
■93867 / 2階層)  Re[2]: バイナリファイル⇒元データファイルへの復元方法(VB.net
□投稿者/ なす (2回)-(2020/02/14(Fri) 11:31:48)
No93865 (Hongliang さん) に返信
> 2020/02/14(Fri) 11:20:58 編集(投稿者)
>
> > Using sr As New System.IO.StreamReader(resStream, ENC)
>> Dim str = sr.ReadToEnd
>
> 元々のファイルがENCでエンコードされたテキストファイルでない限り、
> この方法ではデータが破損します。
> 直接ファイルにダウンロードするなら、以下のようにします。
> Using fs As New FileStream(ファイルパス, FileMode.Create)
> resStream.CopyTo(fs)
> End Using
>
> StreamReaderはテキストデータにのみ使用できます。
> ExcelファイルにせよPDFファイルにせよ、テキストデータではありません。

出来ました!感謝致します!
解決済み
[ 親 93864 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -