質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

5129閲覧

【VB.NET、ASP.NET】base64にデコードされたJPGファイルをエンコードしてダウンロードさせる方法

frzt00

総合スコア1

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/12/04 06:24

編集2021/12/04 07:07

前提・実現したいこと

VB.NETでASP.NET開発をしています。
DBからJPGファイルをBase64の文字列にしたデータを取得して、ダウンロードさせる処理を作成しています。

発生している問題・エラーメッセージ

ダウンロードされたファイルを開くと
「このファイルは読み取れません。このビットマップファイルは無効であるか、または現在サポートされていない形式です。」
と表示されてしまう。

該当のソースコード

VB.NET

Response.ContentType = "image/jpeg" Response.AddHeader("Content-Disposition","attachment;filename=test.jpg") Response.Write("data:image/png;base64,xxxxx..." ) Response.End()

試したこと

Response.ContentType = "application/octet-stream" にしてみたが結果は変わらず。

Response.Redirect("data:image/png;base64,xxxxx..." , true ) にしたところアクセスエラーページが開かれた。

補足情報(FW/ツールのバージョンなど)

ASP.NET Web Forms
OS Microsoft Windows10 20H2
.NET Framework 4.5.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/12/04 06:50

何を作っているか(ASP.NET と言っても Web Forms, MVC, Web API, Web Pages, Lazor Pages などいろいろあります)と開発環境(OS, Visual Studio のバージョン、.NET Framework か Core どっちかとそのバージョンなど)を質問欄を編集して追記してください。
frzt00

2021/12/04 07:07

開発環境について追記しました。
guest

回答1

0

ベストアンサー

はっきり言わせてもらえると、やってることがメチャクチャです。

正しくやりたいことを質問に書いているか、回答しても話が通じるか疑問ですが、とにかく質問文を額面通り受け取って回答します。

DBからJPGファイルをBase64の文字列にしたデータを取得して、

データベースには jpeg 画像のバイト列を base64 でエンコードした文字列が格納されていて、ユーザーから要求を受けると何らかの方法でデータベースにクエリを投げてその文字列を取得できると理解します。

ダウンロードさせる処理を作成しています。

で、ユーザーにダウンロードさせるのはその文字列ではなくて、その文字列を base64 でデコードして元の jpeg 画像のバイト列に戻してユーザーに送信し、xxx.jpg ファイルとしてユーザーが PC に保存するということと理解します。

上の理解が違っていたらどこがどう違うのか詳しく説明してください。

まず base64 でエンコードされた文字列を元のバイト列にデコードしてください。

String imgBase64 = "DB から取得した base64 文字列"; Byte[] imgByteArray = Convert.FromBase64String(imgBase64);

そのバイト列 imgByteArray を HttpResponse.BinaryWrite メソッドを使って出力ストリームに書き込むというのが基本です。

HttpResponse.BinaryWrite(Byte[]) メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system.web.httpresponse.binarywrite?view=netframework-4.8

その際、ブラウザによってファイルの種類を判断する方法が異なるので、Content-Disposition ヘッダと Content-Type ヘッダの両方を正しく指定しておきましょう。

それには、HttpResponse.AppendHeader メソッドと HttpResponse.ContentType プロパティを使ってください。

HttpResponse.AppendHeader(String, String) メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system.web.httpresponse.appendheader?view=netframework-4.8

HttpResponse.ContentType プロパティ
https://docs.microsoft.com/ja-jp/dotnet/api/system.web.httpresponse.contenttype?view=netframework-4.8

不明点などがあれば下のコメント欄で聞いてください。

投稿2021/12/04 09:03

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問