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

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

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

Re[7]: ASP.NET バイナリの圧縮について


(過去ログ 62 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■35733 / inTopicNo.1)  ASP.NET バイナリの圧縮について
  
□投稿者/ パンサー (1回)-(2009/05/13(Wed) 08:29:19)

分類:[.NET 全般] 

はじめまして
最近、ASP.NETを始めた初心者です。

現在、WEB等を参考に、ファイルをデータベースにアップロードするプログラムを組んでいるのですが
ファイル自体の、バイナリフィールドへの保存と、そこからの取り出しは出来たのですが
ひとつ行き詰っているところがあり、WEBで調べても見つけられなかったので
アドバイスをいただきたく、投稿しました。よろしくお願いいたします。

やりたいことは、以下の構造のテーブルがありまして
テーブル1に、ファイルがバイナリで保存されています。

テーブル1
| id | filename | bynary |
-------------------------------
| 1 | aaa.txt |*********|
| 2 | bbb.jpg |*********|
| 3 | ccc.gif |*********|


テーブル2
| id | filename | bynary |
-------------------------------
| 1 | ddd.zip |*********|


この、3つのファイルをまとめて、テーブル2に、ddd.zip で保存したいのですが
WEBなどで調べると、ファイルをフォルダにまとめて圧縮するのは見つかるのですが
バイナリデータをまとめて、バイナリデータで保存する方法が分かりません。

いったん、サーバー上にファイルとしてテーブル1から3つのファイルを保存して
それを、まとめて圧縮、テーブル2に保存という方法しかないでしょうか?
それとも、なにか直接保存する方法があるのでしょうか?
素人考えで恐縮ですが、一旦ファイルにするより、直接のほうがパフォーマンスがいいように思うのですが
また、実ファイルを作るとそれの管理(削除等)の処理が発生するのでなるべくシンプルにしたいのですが
何か方法はありますでしょうか?

よい方法があれば、教えてください。よろしくお願いいたします。

環境は以下になります。
使用しているOS : Windows XP
.NET Framework : .NET Framework 3.0
統合開発環境 :Visual Web Developer 2008 Express Edition
開発言語 :ASP.NET (VB.NET)

引用返信 編集キー/
■35734 / inTopicNo.2)  Re[1]: ASP.NET バイナリの圧縮について
□投稿者/ .SHO (822回)-(2009/05/13(Wed) 08:39:44)
No35733 (パンサー さん) に返信

> WEBなどで調べると、ファイルをフォルダにまとめて圧縮するのは見つかるのですが
> バイナリデータをまとめて、バイナリデータで保存する方法が分かりません。

バイナリデータもファイルです。
圧縮されたファイルもバイナリーデータです。

引用返信 編集キー/
■35876 / inTopicNo.3)  Re[2]: ASP.NET バイナリの圧縮について
□投稿者/ 黒龍 (131回)-(2009/05/15(Fri) 08:45:49)
zipなりを作りたいってことでしょうか?
標準クラスでできればいいんですが今はお手軽な方法があんまりないですね。古いけどZipOutputStreamが一番お手軽かなと思います。
引用返信 編集キー/
■35890 / inTopicNo.4)  Re[3]: ASP.NET バイナリの圧縮について
□投稿者/ パンサー (2回)-(2009/05/15(Fri) 11:22:14)
自分なりに下記までやってみたんですが
********* の部分をどうすればいいのか分かりません。
根本的に何か間違っているのでしょうか?
勉強不足で申し訳ございませんが、ご教授お願いいたします。

(投稿時にストアが引っかかったので、カタカナ表記にしました)

Dim zipStream As New ZipOutputStream(New ByteArrayOutputStream)

Dim setting As ConnectionStringSettings = ConfigurationManager.ConnectionStrings("aaaaa")
Dim factory As DbProviderFactory = DbProviderFactories.GetFactory(setting.ProviderName)

Using db As DbConnection = factory.CreateConnection()

db.ConnectionString = setting.ConnectionString

Dim comm As DbCommand = factory.CreateCommand()
comm.CommandText = "SELECT file_name, data_binary FROM table1 WHERE id IN (1,2,3)"

comm.Connection = db
db.Open()

Dim reader As DbDataReader = comm.ExecuteReader()
Do While reader.Read()

Dim zEntry As New ZipEntry(reader(0).ToString())
zEntry.setMethod(ZipOutputStream.DEFLATED)
zipStream.putNextEntry(zEntry)
zipStream.write(reader(1), 0, reader(1).Length)
zipStream.closeEntry()

Loop

reader.Close()
zipStream.flush()

Dim cnStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("aaaaa").ConnectionString
Using connection As New SqlConnection(cnStr)

Try

Dim command As New SqlCommand("sp_aaa", connection)
command.CommandType = Data.CommandType.ストアドProcedure
command.Parameters.Add(New SqlParameter("@file_name", Data.SqlDbType.NVarChar)).Value = "ddd.zip"
command.Parameters.Add(New SqlParameter("@data_binary", Data.SqlDbType.Binary)).Value = *********
connection.Open()

command.ExecuteNonQuery()
引用返信 編集キー/
■35895 / inTopicNo.5)  Re[4]: ASP.NET バイナリの圧縮について
□投稿者/ やじゅ (999回)-(2009/05/15(Fri) 12:45:16)
やじゅ さんの Web サイト
No35890 (パンサー さん) に返信
> 自分なりに下記までやってみたんですが
> ********* の部分をどうすればいいのか分かりません。
> command.Parameters.Add(New SqlParameter("@file_name", Data.SqlDbType.NVarChar)).Value = "ddd.zip"
> command.Parameters.Add(New SqlParameter("@data_binary", Data.SqlDbType.Binary)).Value = *********

感ですので、試してません。

Dim byteStream As ByteArrayOutputStream = New ByteArrayOutputStream
Dim zipStream As New ZipOutputStream(byteStream)
command.Parameters.Add(New SqlParameter("@data_binary", Data.SqlDbType.Binary)).Value = byteStream.toByteArray()

SQL ServerとADO.NETを用いたBLOB(バイナリラージオブジェクト)の処理方法
http://japan.internet.com/column/developer/20081024/26.html
引用返信 編集キー/
■35957 / inTopicNo.6)  Re[5]: ASP.NET バイナリの圧縮について
□投稿者/ パンサー (3回)-(2009/05/16(Sat) 17:04:58)
No35895 (やじゅ さん) に返信
> ■No35890 (パンサー さん) に返信
>>自分なりに下記までやってみたんですが
>>********* の部分をどうすればいいのか分かりません。
>> command.Parameters.Add(New SqlParameter("@file_name", Data.SqlDbType.NVarChar)).Value = "ddd.zip"
>> command.Parameters.Add(New SqlParameter("@data_binary", Data.SqlDbType.Binary)).Value = *********
>
> 感ですので、試してません。
>
> Dim byteStream As ByteArrayOutputStream = New ByteArrayOutputStream
> Dim zipStream As New ZipOutputStream(byteStream)
> command.Parameters.Add(New SqlParameter("@data_binary", Data.SqlDbType.Binary)).Value = byteStream.toByteArray()
>
> SQL ServerとADO.NETを用いたBLOB(バイナリラージオブジェクト)の処理方法
> http://japan.internet.com/column/developer/20081024/26.html

やじゅさんありがとうございました。
上記内容で試してみました。

パラメータ値を SByte[] から Byte[] に変換できませんでした。
とのエラーが出てしまいました。
ZipOutputStreamに指定するストリームが間違っているんでしょうか?
それとも、根本的に出来ないんでしょうか?
どうすればいいか、どなたかご教授お願いいたします。
引用返信 編集キー/
■35963 / inTopicNo.7)  Re[6]: ASP.NET バイナリの圧縮について
□投稿者/ やじゅ (1005回)-(2009/05/16(Sat) 20:04:54)
やじゅ さんの Web サイト
No35957 (パンサー さん) に返信
> パラメータ値を SByte[] から Byte[] に変換できませんでした。
> とのエラーが出てしまいました。

単純にSByte[] から Byte[] に変換すればいいんじゃないの

Dim byteStream As ByteArrayOutputStream = New ByteArrayOutputStream
Dim zipStream As New ZipOutputStream(byteStream)

Dim writeStream As Byte() = New Byte(byteStream.size() - 1) {}
System.Buffer.BlockCopy(byteStream.toByteArray(), 0, writeStream, 0, byteStream.size())
command.Parameters.Add(New SqlParameter("@data_binary", Data.SqlDbType.Binary)).Value = writeStream

試してないけど、こんな感じかな

圧縮ファイルのダウンロードについて
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42001&forum=7&start=8
C#のコードをVB.NETへ変換する
http://dobon.net/vb/dotnet/links/convertcs2vb.html
引用返信 編集キー/
■35969 / inTopicNo.8)  Re[7]: ASP.NET バイナリの圧縮について
□投稿者/ パンサー (4回)-(2009/05/16(Sat) 22:22:45)
No35963 (やじゅ さん) に返信
> ■No35957 (パンサー さん) に返信
>>パラメータ値を SByte[] から Byte[] に変換できませんでした。
>>とのエラーが出てしまいました。
>
> 単純にSByte[] から Byte[] に変換すればいいんじゃないの
>
> Dim byteStream As ByteArrayOutputStream = New ByteArrayOutputStream
> Dim zipStream As New ZipOutputStream(byteStream)
>
> Dim writeStream As Byte() = New Byte(byteStream.size() - 1) {}
> System.Buffer.BlockCopy(byteStream.toByteArray(), 0, writeStream, 0, byteStream.size())
> command.Parameters.Add(New SqlParameter("@data_binary", Data.SqlDbType.Binary)).Value = writeStream
>
> 試してないけど、こんな感じかな
>
> 圧縮ファイルのダウンロードについて
> http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42001&forum=7&start=8
> C#のコードをVB.NETへ変換する
> http://dobon.net/vb/dotnet/links/convertcs2vb.html

やじゅ さん、ありがとうございました。
無事、望んでいた結果を得ることが出来ました。
みなさん、ありがとうございます。

今後は、もっと勉強して他の方の手助けを少しでもできるように、がんばります。

本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -