2

我已经构建了可以使用 Plupload 将多个图像上传到服务器的工作 VB.net 代码。我正在使用 HTTPHandler (FileUpload.ashx) 进行升级,并希望添加一条 SQL 语句,将每个图像文件名插入我的 SQL 数据库。我尝试将 SQL 添加到处理程序,但是当我这样做时,我会为每个上传的 iamge 获得 4 个数据库条目。我真的不明白为什么,需要一些指导。提前感谢您的时间。

相关处理程序代码:

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

        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
4

2 回答 2

1

如果你正在使用块,那么确保你触发你的 SQL,因为最后一个块已被保存

例如。

  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,因为如果有意义的话,块是最后一个块的 -1。

要获取文件名,您需要在 handler.ashx 中添加是..

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

为了从 Pluplaod 获取唯一的文件名到你的处理程序,你需要告诉 Plupload(在客户端)使用唯一的名称。

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

在您的处理程序中,您'name'再次调用请求,您将拥有 pluplaoder 制作的 unqie 名称..也可以像往常一样请求多部分中的数据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"))

为了响应您的 SQL,您需要用'空格和特殊字符封装文件名,否则会破坏 SQLCommand,因为 SQL 会认为它是另一个变量或命令,而不是将其纯粹视为字符串。这也是 SQL Injection 的常见问题。因为这样的代码而让黑客注入代码。

于 2012-04-12T16:18:04.973 回答
1

南瓜,我不认为我解释得很好。对不起,我确定是蹩脚的条款,我同时是 plupload 和处理程序的新手。

我使用唯一命名作为“假”,因为我需要保留每个文件的原始名称。我目前在上传到服务器时正确命名了文件名,但是对于我的 SQL 插入,我需要插入这些相同的名称。如果我尝试使用我声明的 FileName (context.Request("name")) 作为我的 SQL 语句中的一个值,我会立即得到一个错误并且没有插入值。如果我为文件名使用静态值只是为了测试,它会很好地插入,但当然对于我上传的每个文件来说它的名称相同。

包括您的更新,这是我目前为我的处理程序和客户端脚本所拥有的。

处理程序:

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

我的客户脚本:

    <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>
于 2012-04-13T14:41:52.603 回答