2012-04-12 3 views
2

Ich habe funktionierenden VB.net-Code gebaut, der mehrere Bilder mit Plupload auf den Server hochlädt. Ich benutze einen HTTPHandler (FileUpload.ashx), um den Uplading durchzuführen und möchte eine SQL-Anweisung hinzufügen, die jeden der Images Dateinamen in meine SQL-Datenbank einfügt. Ich habe versucht, nur die SQL zum Handler hinzuzufügen, aber wenn ich tue, erhalte ich 4 Datenbankeinträge für jede lamge, die hochgeladen wird. Ich verstehe wirklich nicht warum und brauche eine Anleitung. Danke für deine Zeit im Voraus.HTTPHandler in VB.net zum Hochladen von Dateien mit Hilfe von Plupload

Pertainant HANDLER Code:

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 Insert

 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 

Antwort

1

Wenn Sie Stücke dann vergewissern Sie sich, dass Sie Ihre SQL aster das letzte Chunk gespeichert

Feuer hat Beispielsweise.

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 wird auf CHUNKS verwendet, weil Chunks -1 vom letzten Chunk ist, wenn das Sinn macht.

die Dateinamen zu bekommen alles, was Sie brauchen, ist in Ihrem handler.ashx hinzuzufügen ..

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

Um eindeutige Dateinamen von Pluplaod über zu Ihrem Handler zu erhalten, müssen Sie Plupload sagen (auf der Client), um eindeutige Namen zu verwenden.

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' }, 

In Ihrem Handler Sie rufen Sie die 'name' Anfrage erneut und Sie werden die unqie Namen haben, die gemacht pluplaoder .. auch die Daten in der mehrt bitten Sie tun wie gewohnt 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")) 

In Antwort auf Ihre SQL müssen Sie den Dateinamen mit ' kapseln sonst Leerzeichen und Sonderzeichen wird der SQLCommand, weil SQL wird seine andere Variable oder Befehl zu denken, anstatt es nur als eine Zeichenfolge zu behandeln. Dies ist auch ein häufiges Problem für SQL Injection .. Erlauben Hacker, Code aufgrund von Code wie folgt zu injizieren.

+0

Danke für die Antwort ppumpkin. Ich kann Ihren Code verwenden und erfolgreich einen einzigen Datensatz pro Datei einfügen (anstelle von mehrfachen Einfügungen wie zuvor) "so das ist gut" ... ABER ich kann immer noch keinen eindeutigen Namen für jede der Dateien mit dem "FileName" -Wert einfügen. Ich denke, ich bin verwirrt, wie ich den eindeutigen Dateinamen für jede Datei erhalten soll, die ich hochlade, wenn ich die Einfügung mache "nach" der letzten Datei (wenn Chunks -1) hochgeladen wird. – Jason

+0

@Jason Ich habe noch einige Beispiele hinzugefügt. Ich benutze auch jQuery '$', um einige Daten in multipart zu bekommen. Verwenden Sie fiddler, um die gesendeten Daten abzufangen und Ihren Handler zu debuggen, schauen Sie in 'context.current.request.forms' nach den Parametern. Bitte beachten Sie auch, dass Sie meine Antwort aufheben oder akzeptieren. Danke – ppumkin

+0

Punkt auf den SQL-Code genommen, es war schnell und schmutzig nur für diesen Beitrag getan. Die iamges, mit denen ich teste, haben keine Sonderzeichen oder Leerzeichen. Haben Sie weitere Vorschläge für das Thema, das ich habe? Sorry für das Posten neuer Frage, ich konnte nicht herausfinden, wie meine Frage zu bearbeiten und neue "Code" – Jason

1

ppumpkin, ich denke nicht, dass ich mich gut erklären. Entschuldigung für das, was ich sicher bin, ist lamens Bedingungen, ich bin neu zu plupload und Handler alle zur gleichen Zeit.

Ich verwende eindeutige Namen als "falsch", weil ich den ursprünglichen Namen jeder Datei behalten muss. Ich benenne derzeit die Dateinamen beim Hochladen auf den Server korrekt, aber für meine SQL-Einfügung brauche ich dieselben Namen eingefügt. Wenn ich versuche, den von mir deklarierten FileName (context.Request ("name")) als Wert in meiner SQL-Anweisung zu verwenden, erhalte ich sofort einen Fehler und keinen eingefügten Wert. Wenn ich einen statischen Wert für den zu testenden Dateinamen verwende, fügt er nur gut ein, aber natürlich ist es derselbe Name für jede Datei, die ich hochlade.

Einschließlich Ihrer Updates, das, was ich derzeit für meine Handler und Clients Skript habe.

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 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 

Mein Kunde Script:

<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> 
Verwandte Themen