自前ダウンローダ作成

絵・動画・アプリケーション等々、自作のコンテンツを作成している人は、そのコンテンツを配布する際にどうやって配布するか考えると思います。

最近は無料のファイルストレージサービスでも、かなりの容量を保存できるものがありますのが、多くのサービスは1ファイルのサイズ容量に制限があります。

小さなファイルを配布する際には問題ないですが、動画など大きなファイルを配布したい場合には、有料サービスを利用するか、大容量ファイルでも短期的に保存できるサービスに継続的にアップロードし続けるか、お金か手間かがかかってしまう場合も少なくないかと思います。

そんな時、ファイルを細かく分断してアップロードし、それらをダウンロードしながら結合する自前のダウンローダソフトウェアを作っちゃおうっという企画です。

サーバー提供側からすると、やられたくない方法なので、あんまり大きな声では言えませんが^^;


プラットフォーム:Windows



今回、使用した言語はC#です。開発環境としましては、QuickSharpを使いました。
QuickSharpについてはコチラ

up_20131103111417de3.png

[機能]
・ウェブサーバにアップロードされた分割ファイルをダウンロードし、結合します。
・ダウンロードが途中で中断された場合は、中断されたところから再開できます。
・ダウンロード進行度が表示されます。

[アップロード]
・アップロードしたいファイルを分割します。分割ソフトウェアは、ファイル破断+を使用しました。
 拡張子がmyfile.001、myfile.002と連番になるのが特徴で、それに合わせてソースを書きました。
 ファイル破断+
 http://www.vector.co.jp/soft/win95/util/se283383.html
・サーバーに分割したファイルをアップロードします。
・下記のコードかをコピーして、DownloadInfoをアップロードしたファイルに合わせて変更します。
・ソースコードをコンパイルして、実行ファイルを作成します。

[ダウンロード]
・ダウンローダを起動し、ダウンロード開始ボタンを押します。
・ダウンロードされるのを待ちます。×ボタンで、途中で中断しても大丈夫。


実行ファイル自体は1MB未満なので、配布は簡単ですね。セキュリティソフトになんだその怪しいファイルは!実行するな!と怒られるかもしれませんが^^;


あ、最後に、もしこれでサーバー提供者に怒られることになっても私は知りませんので(・。・


ソースコード
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
using System;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
 
//$/t:winexe
//& RunInOwnWindow
 
class DownloadInfo
{
public string TITLE = "作業実況動画 初めてのゲーム作り Capture1";
public string URL = "http://tibra.web.fc2.com/video/f1/";
public string FILE_NAME = "first-bge-1";
public string FILE_EXT = "mp4";
public int FILE_SIZE = 950; //1ファイルサイズ KB
public int FILE_NUM = 89; //ファイル数
 
}
 
class Program
{
[STAThread] // STAThread をマーク
static void Main()
{
Application.EnableVisualStyles(); // ビジュアルスタイルを有効化
Application.Run(new Form1());
}
}
 
// Form の派生クラス
class Form1 : Form
{
 
DownloadInfo info = new DownloadInfo();
 
//コントロール
Label label = new Label();
Button button = new Button();
ProgressBar progressBar = new ProgressBar();
BackgroundWorker bgWorker = new BackgroundWorker();
 
bool downloaded = false;
FileStream fs = null;
 
// コンストラクタ
public Form1()
{
// フォーム
this.Text = "ダウンローダー"; // フォームのタイトル
this.MaximizeBox = false; // 最大化ボタンを無効化
this.ClientSize = new Size(300, 100); // クライアント領域のサイズ
this.StartPosition = FormStartPosition.CenterScreen;// 中央に表示
this.FormBorderStyle = FormBorderStyle.FixedSingle; // サイズ変更不可
 
//テキストコントロール
label.Text = info.TITLE; // テキスト
label.Location = new Point(10, 10); // 位置
label.AutoSize = true; // 自動サイズ調整
this.Controls.Add(label); // コントロールをフォームに貼り付け
 
//プログレスバー
progressBar = new ProgressBar();
progressBar.Location = new Point(10, 30);
progressBar.Width = 280;
progressBar.Style = ProgressBarStyle.Continuous; // スタイル
this.Controls.Add(progressBar);
 
//ボタンコントロール
button.Text = "ダウンロード開始"; // テキスト
button.Location = new Point(80, 60); // 位置
button.Size = new Size(140, 30); // サイズ
button.Click += new EventHandler(button_Click); // イベントハンドラを登録
this.Controls.Add(button); //コントロールをフォームに貼り付け
 
//バックグラウンド
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
 
}
 
void button_Click(object sender, EventArgs e)
{
if(downloaded == false)
{
bgWorker.RunWorkerAsync();
 
}else{
Application.Exit();
}
}
 
//バックグラウンド処理(ダウンロード)イベント
void bgWorker_DoWork(object sender, DoWorkEventArgs e){
 
string url = info.URL;
string filename = info.FILE_NAME+"."+info.FILE_EXT;
string basename = info.FILE_NAME;
string stream_path =info.FILE_NAME + ".tmp";
 
long one_filesize = info.FILE_SIZE*1024; //Byte
int file_num = info.FILE_NUM;
 
//ボタンの更新
this.button.Text = "ダウンロード中…";
this.button.Enabled = false;
this.button.Update();
 
//キャッシュ読み込み・作成
int start_i = 0;
float rate = 0;
float rate_step = 100 / (float)file_num;
 
if(File.Exists(stream_path))
{
FileInfo finfo = new System.IO.FileInfo(stream_path);
long filesize = finfo.Length;
start_i = (int)(filesize/(one_filesize));
rate = rate_step * start_i;
} else {
FileStream fs = File.Create(stream_path);
fs.Close();
}
 
//WebClient作成
System.Net.WebClient wc = new System.Net.WebClient();
 
for(int i=start_i; i<file_num; i++)
{
//ダウンロード
string fnum = String.Format("{0:D3}", i);
string dl_path = string.Concat(url,basename,".",fnum);
byte[] data = wc.DownloadData(dl_path);
 
//結合
fs = new FileStream(stream_path, FileMode.Append);
fs.Write(data, 0, data.Length);
fs.Close();
 
//プログレスバー更新
rate += rate_step;
progressBar.Value = (int)rate;
 
//タイトル更新
this.Text = "("+(int)rate+"%) ダウンロード中";
this.Update();
}
//WebClient削除
wc.Dispose();
 
//ダウンロードファイルリネーム
File.Delete(filename);
File.Move(stream_path,filename);
 
//フォーム表示更新
this.Text = "ダウンロード完了";
button.Text = "ダウンローダーを閉じる";
button.Enabled = true;
downloaded = true;
}
}
 
関連記事

コメント

コメントの投稿

非公開コメント

このブログについて
□ ブログ内容
決まった趣旨はありません。
興味を持ったこと・日常で行ったことを何でも書きます。

3DCG・プログラミングなどが多めです。

□ 現在の活動
・ウェブサイト制作
 (http://tiblab.net)
・3Dゲーム制作
 (コックパニック)
検索フォーム
ユーザータグ

Blender キャプチャ blendファイル BGE Python GameEngine ムービー Android CG  Red5 Terragen C# C++ 

カテゴリー
プロフィール

TiBra

Author:TiBra
趣味でCG制作、プログラミング等を行っています。メイカーズに憧れています。

ネットを通じた交流を広げたく思っていますので、コメント・メールはお気軽にどぞー

戯言程度のことは、こちらのブログに投稿しています。基本戯言なので、実質移転しているようなものです。

Mail:tibraあっとlive.jp
HP:TibLabmemocode
動画:VimeoFC2動画ニコニコ
ファイル:SkyDrive
企画:3Dゲーム作業実況

Blogリンク
不都合がございましたらご連絡ください。
当ブログのリンクバナー
FC2 ID
FC2カウンター
RSSフィード+解析コード