2012-04-12 13 views
2

Pluploadを使用して複数の画像をサーバーにアップロードするVB.netコードを作成しました。私は、upladingを行うためにHTTPHandler(FileUpload.ashx)を使用しています。それぞれの画像ファイル名をSQLデータベースに挿入するSQL文を追加します。私はHandlerにSQLを追加しようとしましたが、アップロードすると、各iamgeに対して4つのデータベースエントリが取得されます。私は本当に理由を理解していないといくつかの指導が必要です。事前にお時間をいただきありがとうございます。Pluploadを使用してファイルをアップロードするVB.netのHTTPHandler

Pertainant HANDLERコード:

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest 

    Dim chunk As Integer = If(context.Request("chunk") IsNot Nothing, Integer.Parse(context.Request("chunk")), 0) 
    Dim fileName As String = If(context.Request("name") IsNot Nothing, context.Request("name"), String.Empty) 
    Dim fileUpload As HttpPostedFile = context.Request.Files(0) 

    Dim uploadPath = context.Server.MapPath("Upload") 
    Using fs = New FileStream(Path.Combine(uploadPath, fileName), If(chunk = 0, FileMode.Create, FileMode.Append)) 
     Dim buffer = New Byte(fileUpload.InputStream.Length - 1) {} 
     fileUpload.InputStream.Read(buffer, 0, buffer.Length) 

     fs.Write(buffer, 0, buffer.Length) 
    End Using 
    context.Response.ContentType = "text/plain" 
    context.Response.Write("Success") 

EXP:あなたはチャンクを使用している場合、SQLは、最後のチャンクが

を保存したASTERあなたのSQLを発射することを確認して、その後

 Dim conn As SqlClient.SqlConnection = New SqlClient.SqlConnection(DBCONN) 
    Dim command As SqlClient.SqlCommand = New SqlClient.SqlCommand("W2_InsertPhoto " & fileName, conn) 
    Dim rs As SqlClient.SqlDataReader 
    conn.Open() 
    rs = command.ExecuteReader() 
    rs.Close() 
    rs = Nothing 
    conn.Close() 
    conn = Nothing 

答えて

1

を挿入例えば。チャンクがあるので-1最後のチャンクから、それは理にかなっている場合

chunk = If(context.Request("chunk") IsNot Nothing, Integer.Parse(context.Request("chunk")), 0) 
    chunks = If(context.Request("chunks") IsNot Nothing, Integer.Parse(context.Request("chunks")) - 1, 0) 


If (chunk = chunks) Then 
     'Upload is complete, Save to DB here or whatever 
end if 

は-1 CHUNKSに使用されています。

あなたhandler.ashxに追加する必要があるすべては、ファイル名を取得するには...

fileName = If(context.Request("name") IsNot Nothing, context.Request("name"), String.Empty) 

あなたのハンドラに渡っPluplaodから一意のファイル名を取得するために、あなたは上(Pluploadを伝える必要がありますクライアント)が一意の名前を使用するようにします。通常のrequest

PictureType = If(context.Request("imageType") IsNot Nothing, [Enum].Parse(GetType(PictureType), context.Request("imageType")), Nothing) 


Dim myCustom as String = If(context.Request("custom") IsNot Nothing, context.Request("custom")) 

としてあなたがマルチパートのデータを要求することも..あなたが再び'name'要求を呼び出し、あなたが作ったpluplaoder unqie名前を持つことになり、あなたのハンドラで

var uploader = new plupload.Uploader({ 
     runtimes: 'html5,flash,silverlight,html4', 
     max_file_size: '20mb', 
     url: '../handler.ashx', 
     chunk_size: '100kb', 
     unique_names: true, 
     multipart_params: { imageType: $('#myDiv').attr("MyIMageType"), custom: 'This is static custom text' }, 

あなたのSQLへの応答では、ファイル名を'でカプセル化する必要があります。そうしないと、SQLは別の変数やコマンドを純粋に文字列として扱うのではなく、スペースや特殊文字で区切ります。これはSQLインジェクションの共通の問題です。このようなコードのためにハッカーがコードを挿入できるようにします。

+0

感謝。私はあなたのコードを使用することができますし、 "良い"です...しかし、ファイルごとに1つのレコードを挿入することができます(しかし、マルチプルの代わりに前に挿入)...しかし、私はまだ "FileName"値を使用して各ファイルの一意の名前を挿入することはできません。 最後のファイル(チャンク-1の場合)が挿入された後で、アップロードする各ファイルの一意のファイル名を取得する方法が混乱していると思います。 – Jason

+0

@ Jasonさらにいくつかの例を追加しました。また、mulitpartにいくつかのデータを取得するためにjQuery '$'を使用します。 fiddlerを使用して送信されるデータをキャッチし、ハンドラをデバッグし、パラメタの 'context.current.request.forms'を調べます。また、私のアンサーをupvotingまたは受け入れることを検討してください。ありがとう – ppumkin

+0

ポイントは、SQLコードで撮影、それは迅速かつこのポストのために汚い行われました。私がテストしているiamgesには、特殊文字やスペースはありません。あなたは私が抱えている問題についてさらに提案していますか? 新しい質問を投稿して申し訳ありません。私の質問を編集し、新しいコード " – Jason

1

ppumpkin、私は自分自身をよく説明しているとは思わない。申し訳ありませんが私は確かにlamensの用語ですが、私はpluploadとハンドラのすべての新しいです。

私は各ファイルの元の名前を保持する必要があるので、私は "偽"として一意の命名を使用しています。私は現在、サーバーへのアップロード時にファイル名を正しく指定していますが、私のSQLインサートでは、同じ名前が挿入されている必要があります。私がSQL文の値として宣言したFileName(context.Request( "name"))を使用しようとすると、すぐにエラーが発生し、値が挿入されません。テストするためにファイル名に静的な値を使用すると、それはうまく挿入されますが、アップロードするファイルごとに同じ名前が挿入されます。

私のハンドラーとクライアントのスクリプトには現在、このアップデートが含まれています。

ハンドラ:

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest 

    Dim chunk As Integer = If(context.Request("chunk") IsNot Nothing, Integer.Parse(context.Request("chunk")), 0) 
    Dim chunks As Integer = If(context.Request("chunks") IsNot Nothing, Integer.Parse(context.Request("chunks")) - 1, 0) 
    Dim fileName As String = If(context.Request("name") IsNot Nothing, context.Request("name"), String.Empty) 

    If (chunk = chunks) Then 
     Dim conn As SqlClient.SqlConnection = New SqlClient.SqlConnection(mdata.DBCONN) 
     Dim command As SqlClient.SqlCommand = New SqlClient.SqlCommand("W2_InsertPhoto 12345," & **fileName**, conn) 
     Dim rs As SqlClient.SqlDataReader 
     conn.Open() 
     rs = command.ExecuteReader() 
     rs.Close() 
     rs = Nothing 
     conn.Close() 
     conn = Nothing 
    End If 

    Dim fileUpload As HttpPostedFile = context.Request.Files(0) 

    Dim uploadPath = context.Server.MapPath("Upload") 
    Using fs = New FileStream(Path.Combine(uploadPath, fileName), If(chunk = 0, FileMode.Create, FileMode.Append)) 
     Dim buffer = New Byte(fileUpload.InputStream.Length - 1) {} 
     fileUpload.InputStream.Read(buffer, 0, buffer.Length) 
     fs.Write(buffer, 0, buffer.Length) 
    End Using 
End Sub 

私のクライアントスクリプト:返信ppumpkinため

<script type="text/javascript"> 
    // Convert divs to queue widgets when the DOM is ready 
    $(function() { 
     $("#uploader").pluploadQueue({ 
      // General settings,silverlight,browserplus,html5gears, 
      runtimes: 'flash', 
      url: 'FileUpload.ashx', 
      max_file_size: '10mb', 
      chunk_size: '1mb', 
      unique_names: false, 

      // Specify what files to browse for 
      filters: [{ title: "Image files", extensions: "jpg,jpeg,gif,png,bmp"}], 
      // Flash settings 
      flash_swf_url: 'assets/resources/plupload.flash.swf', 


      // Silverlight settings 
      silverlight_xap_url: 'assets/resources/plupload.silverlight.xap', 

      init: { 
       FileUploaded: function (up, file, info) { 
       } 
      } 
     }); 

     // Client side form validation 
     $('form').submit(function (e) { 
      var uploader = $('#uploader').pluploadQueue(); 

      // Validate number of uploaded files 
      if (uploader.total.uploaded == 0) { 
       // Files in queue upload them first 
       if (uploader.files.length > 0) { 
        // When all files are uploaded submit form 
        uploader.bind('UploadProgress', function() { 
         if (uploader.total.uploaded == uploader.files.length) 
          $('form').submit(); 
        }); 
        uploader.start(); 
       } else 
        alert('You must at least upload one file.'); 

       e.preventDefault(); 
      } 
     }); 
     //tweak to reset the interface for new file upload 
     $('#btnReset').click(function() { 
      var uploader = $('#uploader').pluploadQueue(); 

      //clear files object 
      uploader.files.length = 0; 

      $('div.plupload_buttons').css('display', 'block'); 
      $('span.plupload_upload_status').html(''); 
      $('span.plupload_upload_status').css('display', 'none'); 
      $('a.plupload_start').addClass('plupload_disabled'); 
      //resetting the flash container css property 
      $('.flash').css({ 
       position: 'absolute', top: '292px', 
       background: 'none repeat scroll 0% 0% transparent', 
       width: '77px', 
       height: '22px', 
       left: '16px' 
      }); 
      //clear the upload list 
      $('#uploader_filelist li').each(function (idx, val) { 
       $(val).remove(); 
      }); 
     }); 
    }); 
</script> 
関連する問題