検索
ホームページphp教程PHP开发jQuery Webuploader は大きなファイルを分割してアップロードします

通常、ファイルをアップロードする場合、アップロードするファイルはクライアント経由でサーバーにアップロードされます。動画などの大きなファイルをアップロードすると、サーバーのメモリが非常に圧迫されます。 、一般に、非同期アップロードには Flash または HTML5 を使用します。ファイルが比較的大きい場合、クライアントがファイルが 100% アップロードされたことを示していても、現在のページのサーバーへのリクエストは依然として長い待ち時間が発生します。もブロックされます。

通常の状況では、通常、長い転送が完了した後、サーバーに直接保存されます。

public void ProcessRequest(HttpContext context)
  {
   context.Response.ContentType = "text/plain";
   //保存文件
   context.Request.Files[0].SaveAs(context.Server.MapPath("~/1/" + context.Request.Files[0].FileName));
   context.Response.Write("Hello World");
  }

最近、Baidu のオープンソース アップロード コンポーネント webuploader がプロジェクトで使用されました。公式の紹介では、webuploader はマルチパート アップロードをサポートしています。

var uploader = WebUploader.create({
   auto: true,
   swf:'/webuploader/Uploader.swf',
   // 文件接收服务端。
   server: '/Uploader.ashx',
   // 内部根据当前运行是创建,可能是input元素,也可能是flash.
   pick: '#filePicker',
   chunked: true,//开启分片上传
   threads: 1,//上传并发数
   //由于Http的无状态特征,在往服务器发送数据过程传递一个进入当前页面是生成的GUID作为标示
   formData: {guid:"<%=Guid.NewGuid().ToString()%>"}
  });

webuploader のマルチパートアップロードは、ファイルをいくつかの部分に分割し、アップロードされたファイルがフラグメントのサイズより大きい場合、データをファイル受信側に投稿します。 2 つのフォーム要素 chunk と chunks をデータに追加します。前者はアップロードされたフラグメント内の現在のフラグメントの順序 (0 から始まる) を示し、後者はフラグメントの総数を表します。

ファイルを選択すると7つのシャードに分割されたため、Uploader.ashxにデータを投稿する処理が7回行われました。

jQuery Webuploader は大きなファイルを分割してアップロードします

各リクエスト内のフォーム要素のチャンクとチャンク、およびそれらが同じファイルのフラグメントであることを示す GUID

jQuery Webuploader は大きなファイルを分割してアップロードします

サーバーがデータを受信した後、データはこれらのパラメーターに従って処理できます。

1.GUIDを押して一時ファイルを作成します

2.受信したフラグメントデータをGUIDに対応するファイルに追加します。

3. アップロードされたファイル名に従って一時ファイルの名前を変更します

4. シャーディングがない場合は、直接保存します

public void ProcessRequest(HttpContext context)
  {
   context.Response.ContentType = "text/plain";
   //如果进行了分片
   if (context.Request.Form.AllKeys.Any(m => m == "chunk"))
   {
    //取得chunk和chunks
    int chunk =Convert.ToInt32(context.Request.Form["chunk"]);
    int chunks = Convert.ToInt32(context.Request.Form["chunks"]);
 
     
    //根据GUID创建用该GUID命名的临时文件
    string path = context.Server.MapPath("~/1/" + context.Request["guid"]);
    FileStream addFile = new FileStream(path, FileMode.Append, FileAccess.Write);
    BinaryWriter AddWriter = new BinaryWriter(addFile);
    //获得上传的分片数据流
    HttpPostedFile file = context.Request.Files[0];
    Stream stream = file.InputStream;
 
    BinaryReader TempReader = new BinaryReader(stream);
    //将上传的分片追加到临时文件末尾
    AddWriter.Write(TempReader.ReadBytes((int)stream.Length));
    //关闭BinaryReader文件阅读器
    TempReader.Close();
    stream.Close();
    AddWriter.Close();
    addFile.Close();
 
    TempReader.Dispose();
    stream.Dispose();
    AddWriter.Dispose();
    addFile.Dispose();
    //如果是最后一个分片,则重命名临时文件为上传的文件名
    if (chunk == (chunks - 1))
    {
     FileInfo fileinfo = new FileInfo(path);
     fileinfo.MoveTo(context.Server.MapPath("~/1/" + context.Request.Files[0].FileName));
    }
   }
   else//没有分片直接保存
   {
    context.Request.Files[0].SaveAs(context.Server.MapPath("~/1/" + context.Request.Files[0].FileName ));
   }
   context.Response.Write("ok");
  }

ニーズは一時的に満たされていますが、未解決の問題がまだいくつかあります:

1 . アップロード同時実行数が1を超えた場合 このとき、処理が完了していない分割アップロードサーバーが存在し、同時に2番目の分割が到着するため、ファイルが占有されているというエラーが発生します。
2. ロックによって最初の問題が解決される場合、ロックは間違いなく効率に影響します (同時に、ファイルを保存するコードにアクセスできるのは 1 つのプロセスのみです)。
3. ファイルの順序に問題があるため、2 番目のフラグメントが最初に到着し、その後にストリームを一時ファイルに追加することはできません。すべてのフラグメントが処理されるまで待ちます。アップロードが完了すると、1 つのファイルに結合されます。

これは単なるデモです。誰かが既存の問題の解決を手伝ってくれることを願っています。


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境