このトピックは、アップロード ファイルをファイルまたはメモリストリームとして処理し、保存する方法を説明します。詳細な手順は、各プロセスでメモリストリームとしてファイルを保存トピックをご参照ください。
このトピックを理解するために、以下のトピックを参照することをお勧めします。
igUpload の概要: このトピックは igUpload
コントロールおよびその機能について紹介します。このトピックでは、このコントロールを HTML ページへ追加する方法を示します。
igUpload の構成: このトピックは、igUpload
コントロールの構成方法をコード例を用いて説明します。
HTTP ハンドラーおよびモジュールの使用 (igUpload): このトピックは、HTTP モジュールおよび HTTP ハンドラーを構成して、igUpload
コントロールでアップロードされるデータを承諾するのに必要なサーバー イベントを処理する方法をデモします。
クライアント側イベントの使用 (igUpload): このトピックは、igUpload
コントロールにより起動されたクライアント側イベントの処理方法を説明します。
このトピックは、以下のセクションで構成されます。
ファイルをアップロードする際に、通常サーバーで処理します。たとえば、ファイル システムに保存する前にデータベースに保存または圧縮します。
ファイルのアップロード処理を有効にするには、Ignite UI for MVC Upload
の HTTP モジュールを有効にする必要があります。このモジュールを有効にするには、プロジェクトの web.config ファイルに登録してください。正確な構成は、インストール済みのインターネット インフォメーション サービス (IIS) バージョンにより異なります。
ファイルをアップロードして正しく処理するには、igUpload
コントロールは、ファイル サイズやアップロード状態および進行状況などファイルやアップロード処理に関するデータの一部が必要です。このデータ交換を可能にするには、Ignite UI for MVC Upload
の HTTP モジュールを有効にする必要があります。このハンドラーを有効にするには、プロジェクトの web.config ファイルに登録してください。正確な構成は、インストール済みのインターネット インフォメーション サービス (IIS) バージョンにより異なります。
igUpload
コントロールは、明示的に定義されたアプリケーション設定なしで機能できます。ただし、以下のようなものを常に構成するには実施するとよいです。
そのようなフォルダーが構成されないと、ファイルは <project folder>/Uploads
であるデフォルト位置にストアされます。
アップロード ファイルの最大サイズは maxFileSizeLimit
プロパティで設定します。デフォルト値は 4 Mb です。
ファイル保存モードは、ファイルの処理方法 (ファイル ストリームまたはメモリ ストリーム) を指定します。(詳細については、ファイル処理の概要を参照してください)。ファイル保存モードは、FileSaveType
プロパティにより管理されます。許可される値は、ファイル処理のそれぞれのマナーに対応する filestream
と memorystream
です。デフォルト値はファイルストリーム
です。
View では、igUpload
のクライアント側エラー処理と同様に、igLoader
コンポーネントおよび igUpload
を構成する必要があります。
コントローラーでは、各ファイルのデータ群を処理するメソッドを実装する必要があります。
以下は、ファイルをストリームとして保存するための概念的なステップです。
Ignite UI for MVC Upload
は、アップロード中またはサーバー上の一時ファイルに保存された後にオンデマンドでファイルが処理されるかどうかに応じて、アップロード ファイルを処理する以下の方法を提供します。
Upload
の HTTP モジュールにより一時ファイルとして保存されます。ファイルの保存後にファイルを処理できます。このモードはファイルをサーバー ファイル システムに保存する場合に使用します。ファイル ストリーム モードは、一時的な場所にファイルをアップロード (fileUploadPath
アプリケーション設定によって示します) し、処理を選択するまで保持されます。アップロードされるファイルを処理するために、UploadFinishing
イベントを処理する必要があります。UploadFinishing
イベントには FilesStream
タイプのパラメーターがあり、アップロードしたファイルにアクセスできます。このパラメーターを使用すると、ファイルを他の場所へ移動できます。ファイルを手動で処理する場合、UploadFinishingEventArgs.Cancel
プロパティを true
に設定する必要があります。このやり方で、一時ファイル (存在する場合) は igUpload により削除されます。
UploadFinishing
イベントが処理されない場合、一時ファイルは元のファイルに名前変更され、既存のファイルを同じ名前で上書きし一時フォルダーに置かれたままになります。
メモリ ストリーム処理を使用する場合、ファイルは手動で処理できる MemoryStream
オブジェクトにアップロードされます。Ignite UI for MVC Upload
コンポーネントは、MemoryStream
にアップロードするために以下のアプローチを提供します (処理するイベントやそれらのイベントの処理方法に基づく)。
(推奨) 各グループを処理します。
ファイルを手動で処理するには、FileUploading イベントを処理する必要があります。FileUploading の FileUploadingEventArgs パラメーターにタイプ バイト配列の FileChunk プロパティが必要です。(このプロパティは、現在の/最後のデータのアップロードされたデータ群を保存します。) FileUploading はキャンセル可能なイベントであり、ファイルの一部が処理されているかどうかにかかわらず、Upload の HTTP モジュールにフィードバックを返すために使用できます。イベントをキャンセルすることを選択するかどうかは、ファイル群を自動で処理するか手動で処理するかによります。
ファイルの一部を手動で処理
ファイルの一部を手動で処理する場合、イベントをキャンセルする必要があります。そのような場合、Ignite UI for MVC Upload
は、内部の MemoryStream オブジェクトに追加しません。この方法は、アップロード済みの各ファイルの一部を処理してメモリ ストリームとしてファイルを保存 - 手順 をご参照ください。
ファイルの一部を自動処理
FileUploading
イベントをキャンセルしない場合、ファイルの一部は MemoryStream
オブジェクトに追加し、UploadFinishing
イベント (UploadFinishingEventArgs.FileStream) で利用可能になります。
FileUploading
イベントを処理するには、UploadProgressManager
クラスの AddFileUploadingEventHandler
メソッドを使用します。UploadProgressManager
は、シングルトン クラス インスタンスで、Instance プロパティからアクセスできます。
これは UploadFinishing
イベントを処理して達成できます。UploadFinishing
の UploadFinishingEventArgs
パラメーターには、FileStream
プロパティがあり、MemoryStream
オブジェクトとしてアップロード ファイルを保持します。このプロパティ (UploadFinishingEventArgs.FileStream
) を使用してファイル データを処理します。このアプローチでは、ファイルが完全にサーバーにアップロードされるまでメモリ内にファイル データが保持されてしまいます。
この例では、FileUploading
イベントを処理し各ファイルの一部を個別に処理することにより、メモリ ストリーム処理を使用して igUpload
を構成します。アップロードされたファイルの一部は、ASP.NET キャッシュ バッファーに追加されます。バッファーが特定のしきい値に達するとディスク上のファイルに書き込みます。この方法により、RAM の igUpload
使用を最適化でき、より多くのファイルを同時にアップロードできます。
この例は、ファイル キャッシュ機能を実装するためにカスタム クラスを作成します。UploadUtils
は静的なクラスで、現在アップロードしているファイルをキャッシュのMemoryStream
ディクショナリで処理します。また、ファイルをこのディレクトリに書き込むために、igUpload
の fileUploadPath
アプリケーション設定を使用します。
更に、一時ファイルを保存するフォルダーが作成され、アップロード ファイルの最大サイズが 100 Mb に設定されます。
以下は、各アップロード済みファイルの一部を個別に処理してファイルをメモリ ストリームとして保存するための一般的な要件です。
igUploadMemoryStreamExample
」と呼ばれる C# ASP.NET MVC 3 Web アプリケーションの Microsoft Visual Studio プロジェクトInfragistics.Web.Mvc.dll
ファイルへの参照<project folder>/Views/Shared/_Layout.cshtml
ファイルへ追加された以下のスクリプト<project folder>/Scripts/jquery-1.5.1.min.js
<project folder>/Scripts/jquery-ui-1.8.11.min.js
プロジェクトに含まれ適切に参照された Infragistics Ignite UI for jQuery エージェント
<project folder>
\Infragistics フォルダーに置かれます。<project folder>/Views/Shared/_Layout.cshtml
ファイル (ファイルはプロジェクトの一部として使用可能) のヘッド タグで参照しなければなりません。
HTML の場合:
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.11.min.js")" type="text/javascript"></script>
一時ファイルがアップロードされる <project folder>\Uploads
フォルダー
RegisterRoutes メソッドの先頭に RegisterRoutes オプションを設定します。
C# の場合:
routes.IgnoreRoute("IGUploadStatusHandler.ashx");
以下はプロセスの概念的概要です。
以下は、ファイルをメモリ ストリームとしてアップロードする方法の手順です。
Ignite UI for MVC Upload
の HTTP モジュールを構成します。
プロジェクトの web.config ファイルで登録することにより HTTP モジュールを有効にします。
Internet Information Services (IIS) 6 の構成
IIS 6 を構成するには、<system.web>
セクションにおいて、web.config ファイルの <httpModules>
セクションで、Ignite UI for MVC Upload
の HTTP モジュールを登録します。
XML の場合:
<system.web>
<httpModules>
<add name="IGUploadModule" type="Infragistics.Web.Mvc.UploadModule" />
</httpModules>
</system.web>
IIS 7 の構成
IIS 7 を構成するには、<system.webServer>
セクションにおいて、web.config ファイルの <modules>
セクションで、Ignite UI for MVC Upload
の HTTP モジュールを登録します。
XML の場合:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="IGUploadModule" type="Infragistics.Web.Mvc.UploadModule"
preCondition="managedHandler" />
</modules>
</system.webServer>
Ignite UI for MVC Upload
の HTTP ハンドラーを構成します。
プロジェクトの web.config ファイルで登録することにより HTTP モジュールを有効にします。
IIS 6 の構成
IIS 6 を構成するには、<system.web>
セクションにおいて、web.config ファイルの <httpHandlers>
セクションで、Ignite UI for MVC Upload
の HTTP ハンドラーを登録します。
XML の場合:
<system.web>
<httpHandlers>
<add verb="GET" type="Infragistics.Web.Mvc.UploadStatusHandler"
path="IGUploadStatusHandler.ashx" />
</httpHandlers>
</system.web>
IIS 7 の構成
IIS 7 を構成するには、<system.webServer>
セクションにおいて、web.config ファイルの <handlers>
セクションで、Ignite UI for MVC Upload
の HTTP ハンドラーを登録します。
XML の場合:
<system.webServer>
<handlers>
<add name="IGUploadStatusHandler" path="IGUploadStatusHandler.ashx" verb="*"
type="Infragistics.Web.Mvc.UploadStatusHandler" preCondition="integratedMode" />
</handlers>
</system.webServer>
Ignite UI for MVC Upload
のアプリケーション設定を構成します。
アプリケーション設定を構成します。
(オプション) 一時ファイル フォルダーを構成します。
以下のコードは、一時ファイルを保存するために Uploads フォルダーを構成します。
XML の場合:
<appSettings>
<add key="fileUploadPath" value="~/Uploads" />
</appSettings>
(オプション) ファイル サイズ制限を構成します。
以下のコード セットは、アップロードするファイルの最大サイズを 100 Mb に設定します。
XML の場合:
<appSettings>
<!--100 Mb = 2097152 bytes-->
<add key="maxFileSizeLimit" value="104857600" />
</appSettings>
ファイル保存モードを構成します。
以下のコードは、ファイル保存モードを memorystream に設定します。
XML の場合:
<appSettings>
<add key="FileSaveType" value="memorystream"/>
</appSettings>
キャッシュ機能を実装する
バッファー サイズを構成します。
A. web.config ファイルを開きます。
B. バッファー サイズ アプリケーション設定を追加します。
この例では、uploadUtilsBufferSize アプリケーション設定でディスクにファイル データを書き込む前にバッファリングする際のしきい値を構成します。この構成を使用して ASP.NET キャッシュで独自のファイル バッファリングを実装します。以下のコードは 2 Mb に設定します。
XML の場合:
<appSettings>
<!--2 Mb = 2097152 bytes-->
<add key="uploadUtilsBufferSize" value="2097152" />
</appSettings>
UploadUtils.cs ファイルをプロジェクトに追加します。
A. プロジェクトを右クリックします。
B. コンテキスト メニューから追加 、次にクラスを選択します。新しい項目を追加ダイアログが開きます。
C. 新しい項目を追加ダイアログの名前フィールドで UploadUtils.cs を入力します。
D. 追加を押します。ファイルがプロジェクトに追加されます。
UploadUtils クラスを実装します。
A. UploadUtils.cs ファイルを開きます。手順のすべてのコードがこのファイルに書き込まれます。
B. クラスを静的にします。
static を UploadUtils クラス定義に追加します。
C# の場合:
public static class UploadUtils
{
// Class definition here see steps 2 to 7
}
C. using 句を追加します。
using 句は、ConfigurationManager および Path クラスに必要です。以下のコードは、最初の using 句は ConfigurationManager クラス用で 2 つ目の using 句は Path クラス用です。
C# の場合:
using System.Configuration;
using System.IO;
D. 定数の定義
uploadUtilsBufferSize および fileUploadPath の設定のためのアプリケーション定義が web.config ファイルに含まれない場合、定数が必要です。
C# の場合:
//4 Mb default buffer size
private const int DEFAULT_BUFFER_SIZE = 4 * 1024 * 1024;
private const string DEFAULT_UPLOAD_PATH = "~/Uploads";
E. バッファー サイズの構成
静的 BufferSize プロパティを定義します。このプロパティは、uploadUtilsBufferSize アプリケーション設定を返します。
C# の場合:
public static int BufferSize
{
get
{
int bufferSize;
if (Int32.TryParse(ConfigurationManager.AppSettings ["uploadUtilsBufferSize"], out bufferSize))
{
return bufferSize;
}
return DEFAULT_BUFFER_SIZE;
}
}
F. アップロードパス を構成します。以下のコードを追加して、静的 UploadPath プロパティを定義します。このプロパティは、fileUploadPath アプリケーション設定を返します。
C# の場合:
public static string UploadPath
{
get
{
string path = DEFAULT_UPLOAD_PATH;
if (ConfigurationManager.AppSettings["fileUploadPath"] != null)
{
path = ConfigurationManager.AppSettings["fileUploadPath"];
}
if (path.StartsWith("~"))
{
path = HttpContext.Current.Server.MapPath(path);
}
if (!path.EndsWith(Path.DirectorySeparatorChar.ToString()))
path += Path.DirectorySeparatorChar;
if (!Directory.Exists(path))
throw new DirectoryNotFoundException(path);
return path;
}
}
G. メソッドを構成して キャッシュからストリームを取得します。
GetStreamFromCache 静的メソッドを定義します。この静的メソッドは、指定したキーで MemoryStream を返します。これを行うには、Dictionary<string, MemoryStream>
オブジェクトを ASP.NET キャッシュに管理します。ディクショナリは、現在アップロードしているファイルのデータを保留します。「コントローラーで Ignite UI for MVC Upload
を構成する」セクションを参照すると、ファイル全体をキャッシュに保持しなくてもよくなります。代わりに、UploadUtils.BufferSize プロパティでサイズが定義されたデータ群をディスクのファイルに書き込みます。
C# の場合:
public static MemoryStream GetStreamFromCache(string key)
{
Dictionary<string, MemoryStream> uploadingFiles = HttpContext.Current.Cache["UploadingFiles"] as Dictionary<string, MemoryStream>;
MemoryStream stream;
if (uploadingFiles == null)
{
uploadingFiles = new Dictionary<string, MemoryStream>();
HttpContext.Current.Cache["UploadingFiles"] = uploadingFiles;
}
if (!uploadingFiles.ContainsKey(key))
{
stream = new MemoryStream();
uploadingFiles.Add(key, stream);
}
else
{
stream = uploadingFiles[key];
}
return stream;
}
H. メソッドを構成して キャッシュからストリームを削除します。
RemoveStreamFromCache 静的メソッドを定義します。このメソッドは、キーによりディクショナリから項目フォームを削除します。「コントローラーで Ignite UI for MVC Upload
を構成する」セクションを参照し、現在アップロードしているファイルのキャッシュからファイルを削除するために使用します。
C# の場合:
public static void RemoveStreamFromCache(string key)
{
Dictionary<string, MemoryStream> uploadingFiles = HttpContext.Current.Cache["UploadingFiles"] as Dictionary<string, MemoryStream>;
if (uploadingFiles != null && uploadingFiles.ContainsKey(key))
{
uploadingFiles.Remove(key);
}
}
I. ファイルにストリームを書き込む メソッドを構成します。
AppendStreamToFile 静的メソッドを定義します。この静的メソッドは、MemoryStream オブジェクトをファイルに書き込みます。メソッドは、ファイル名と MemoryStream 値をパラメーターとして受け付けます。
C# の場合:
public static void AppendStreamToFile(string fileName, MemoryStream stream)
{
using (FileStream fs = new FileStream(fileName, FileMode.Append))
{
stream.WriteTo(fs);
}
}
View で Ignite UI for MVC Upload
を構成します。
<project folder>\Views\Home\Index.cshtml
ファイルで、コードを入力して View を構成します。
Infragistics.Web.Mvc 名前空間を最初に含めます。
次は、infragistics.loader.js
ファイルへの参照と igUpload
onError
クライアント側イベントのハンドラーです。この OnError
クライアント側ハンドラーは、<div>
要素に対するエラーを uploadErrors
に等しい ID で追加します。<div>
要素は、コード スニペットの末尾で定義されます。
onError
イベントは、サーバー側とクライアント側の 2 つのタイプのイベントを処理します。ui.errorType
プロパティで区別できます。
ui.errorType == “serverside”
の場合、エラーはサーバー上の開発者コードから来ます。メッセージは ui.serverMessage
に保持されます。
ui.errorType == “clientside”
の場合、エラーはクライアント側にあります。メッセージは ui.errorMessage
に保持されます。詳細については、「クライアント側イベントの使用」トピックを参照してください。
onError
ハンドラーが構成された後、igLoader
が定義されます。igLoader
コンポーネントは、igGrid
により使用されるリソースをロードする責任があります。
最終的に、igUpload.ID
は明示的に定義されます。これにより、クライアント側イベントで正しいコントロールにサブスクライブできます。ControlID
メソッドは、サーバー上で識別しそのサーバー側イベントにサブスクライブできるコントロールの識別子を追加します。
C# の場合:
@using Infragistics.Web.Mvc
<script src=@Url.Content("~/Infragistics/js/infragistics.loader.js") type="text/javascript"></script>
<script type="text/javascript">
$(document).delegate("#upload1", "iguploadonerror", function (evt, ui) {
if (ui.errorType === "serverside")
$("#uploadErrors").append("<p>" + ui.serverMessage + "</p>");
else
$("#uploadErrors").append("<p>" + ui.errorMessage + "</p>");
});
</script>
@(Html.Infragistics().Loader()
.CssPath(Url.Content("~/Infragistics/css/"))
.ScriptPath(Url.Content("~/Infragistics/js/"))
.Render())
@(
Html.Infragistics().Upload()
.ID("upload1")
.ControlId("upload1")
.AutoStartUpload(false)
.Mode(UploadMode.Multiple)
.ProgressUrl("/IGUploadStatusHandler.ashx")
.Render()
)
<div id="uploadErrors" style="color: red;"></div>
コントローラーで Ignite UI for MVC Upload
を構成します。
コントローラーを構成するには
<project folder>\Controllers\HomeController.cs
ファイルを開きます。手順のすべてのコードがこのファイルに書き込まれます。
既存の HomeController クラス メソッドを削除します。
igUpload
コントロールのサーバー側イベントを処理するメソッドを定義します。
A. using 句を追加します。以下の using 句を追加します。
C# の場合:
using Infragistics.Web.Mvc;
using System.IO;
UploadStatus 列挙体および MemoryStream クラスで使用されます。
B. Index メソッドを追加します。
インデックス アクション メソッドは、名前が同じ View を返します。
C. igUpload
の FileUploading イベントのハンドラーを追加します。
igUpload_FileUploading メソッドを <project folder>\Controllers\HomeController.cs
ファイルに追加します。
C# の場合:
internal static void igUpload_FileUploading(object sender, FileUploadingEventArgs e)
{
MemoryStream stream = UploadUtils.GetStreamFromCache(e.TemporaryFileName);
stream.Write(e.FileChunk, 0, e.FileChunk.Length);
if (stream.Length >= UploadUtils.BufferSize)
{
string fileName = UploadUtils.UploadPath + e.TemporaryFileName;
stream.Flush();
UploadUtils.AppendStreamToFile(fileName, stream);
stream.Close();
UploadUtils.RemoveStreamFromCache(e.TemporaryFileName);
}
e.Cancel = true;
}
いくつかのファイルが同時にアップロードできるということは、このイベントはファイルに対して非同期に発生することができるという意味であり非常に重要です。データがどのファイルに送信されるのかを見極める方法が必要となる理由がここにあります。1 つの可能性のあるアプローチは、ファイルの名前が一意であることを保証する FileUploadingEventArgs.TemporaryFileName プロパティを調べることです。FileUploading ハンドラーーでは、TemporaryFileName はキーとして使用し、 UploadUtils.GetStreamFromCache 静的メソッドを使用することによりファイル データをキャッシュに書き込みます。
FileUploading ハンドラーは、ストリーム長が UploadUtils.BufferSize しきい値を超える場合、ファイル データをファイルに書き込みます。これにより、コンピュータ RAM がフルに使用されるようになります。
D. igUpload_FinishingUpload メソッドを使用します。
igUpload_FinishingUpload メソッドを <project folder>\Controllers\HomeController.cs
ファイルに追加します。FinishingUpload ハンドラーは、キャッシュに残っている最後のファイルの一部に書き込み、ファイルを元の名前に戻します。同じディレクトリに既存のファイルがある場合、削除されて新しいファイルが書き込まれます。
警告: FinishingUpload ハンドラーは、名前が同じファイルを上書きします。実環境のシナリオでは、ファイルは上書することにはならないため、ユーザー名またはそのほかの識別子を採用してファルが互いに上書きされないようにしますが、当然、実装しているビジネス上のシナリオによります。
C# の場合:
internal static void igUpload_FinishingUpload(object sender, UploadFinishingEventArgs e)
{
string uploadFilePath = UploadUtils.UploadPath;
string fileName = UploadUtils.UploadPath + e.TemporaryFileName;
MemoryStream stream = UploadUtils.GetStreamFromCache(e.TemporaryFileName);
UploadUtils.AppendStreamToFile(fileName, stream);
stream.Close();
UploadUtils.RemoveStreamFromCache(e.TemporaryFileName);
string newFileName = UploadUtils.UploadPath + e.FileName;
if (System.IO.File.Exists(newFileName))
System.IO.File.Delete(newFileName);
System.IO.File.Move(fileName, newFileName);
}
E. igUpload_FinishedUpload メソッドを追加します。
igUpload_FinishedUpload メソッドを <project folder>\Controllers\HomeController.cs
ファイルに追加します。FinishedUpload 実装は、ユーザーがアップロードをキャンセルする状況を処理します。ファイル データを保存する一時ファイルを削除します。
C# の場合:
internal static void igUpload_FinishedUpload(object sender, UploadFinishedEventArgs e)
{
switch (e.FileStatus)
{
case UploadStatus.CancelledByClientCommand:
case UploadStatus.CancelledByClientConnection:
// delete the file if the upload was unsuccessful
System.IO.File.Delete(e.TemporaryFileName);
break;
}
}
igUpload
コンポーネントのサーバー側イベント ハンドラーの登録が必要なのは 1 度のみであるため、Global.asax ファイルの Application_Start メソッドで実行するのが適切です。
Global.asax ファイルを開きます。
using 句を追加します。UploadProgressManager クラスに using 句を追加します。
C# の場合:
using Infragistics.Web.Mvc;
Application_Start メソッドを修正します。
以下のコードは、ControlID が upload1 であるコントロールの FileUploading、FinishingUpload および FinishedUpload イベントにサブスクライブします。この操作は、UploadProgressManager クラスの AddFileUploadingEventHandler、AddFinishingUploadEventHandler および AddFinishingUploadEventHandler メソッドを使用することにより実施します。コードは Application_Start メソッドに追加されます。
C# の場合:
UploadProgressManager.Instance.AddFileUploadingEventHandler("upload1",
new EventHandler<FileUploadingEventArgs>(Controllers.HomeController.igUpload_FileUploading));
UploadProgressManager.Instance.AddFinishingUploadEventHandler("upload1",
new EventHandler<UploadFinishingEventArgs>(Controllers.HomeController.igUpload_FinishingUpload));
UploadProgressManager.Instance.AddFinishedUploadEventHandler("upload1",
new EventHandler<UploadFinishedEventArgs>(Controllers.HomeController.igUpload_FinishedUpload));
結果を確認するには、プロジェクトをビルドして実行します。ファイルをアップロードしてアップロード ファイルの一時フォルダーを確認します。
オンラインで表示: GitHub