在ASP.NET / C#中使用Plupload

UPDATE

我能够让所有的东西都能正常工作,而且我只想用最新的代码发布。 我使用了Darin Dimitrov关于使用单独的通用http处理程序来处理file upload的build议,所以这是我想出的代码…让我知道如果你有问题。

<%@ WebHandler Language="C#" Class="Upload" %> using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.IO; using System.Net; using System.Web; public class Upload : IHttpHandler { public void ProcessRequest(HttpContext context) { /** * If 'newTicket' is "false", then the directory to upload to already exists and we can extract it from * the 'ticketID' POST parameter. * * If 'newTicket' is "true", then this is a new Ticket submission so we need to work with a NEW directory * on the server, so the ID needs to be 1 more than the total number of directories in ~/TicketUploads/ */ String newTicket = context.Request["newTicket"] != null ? context.Request["newTicket"] : String.Empty; int theID = -1; if (newTicket.Equals("true")) { // we need to calculate a new ID theID = getNewID(context); // calculate the new ID = # of rows theID++; // add 1 to make it unique } else if (newTicket.Equals("false")) { // we can just get the ID from the POST parameter theID = context.Request["ticketID"] != null ? Convert.ToInt32(context.Request["ticketID"]) : -1; } else { // something went wrong with the 'newTicket' POST parameter context.Response.ContentType = "text/plain"; context.Response.Write("Error with 'newTicket' POST parameter."); } // if theID is negative, something went wrong... can't continue if (theID < 0) { return; } // ready to read the files being uploaded and upload them to the correct directory int chunk = context.Request["chunk"] != null ? int.Parse(context.Request["chunk"]) : 0; string fileName = context.Request["name"] != null ? context.Request["name"] : string.Empty; var uploadPath = context.Server.MapPath("~/TicketUploads/" + theID + "/"); HttpPostedFile fileUpload = context.Request.Files[0]; // if the NEW directory doesn't exist, create it DirectoryInfo di = new DirectoryInfo("" + uploadPath + ""); if (!(di.Exists)) { di.Create(); } using (var fs = new FileStream(Path.Combine(uploadPath, fileName), chunk == 0 ? FileMode.Create : FileMode.Append)) { var buffer = new byte[fileUpload.InputStream.Length]; fileUpload.InputStream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, buffer.Length); } context.Response.ContentType = "text/plain"; context.Response.Write("File uploaded."); return; } } 

我正在尝试使用C#在ASP.NET中集成Pluploadfile upload器。 我读过“ 愤怒的猴子”文章以及Marco Valsecchi的博客文章,但是我有点迷路。

上述文章中提到的C#大致类似于以下内容:

 int chunk = Request.QueryString["chunk"] != null ? int.Parse(Request.QueryString["chunk"]) : 0; string fileName = Request.QueryString["name"] != null ? Request.QueryString["name"] : string.Empty; HttpPostedFile fileUpload = Request.Files[0]; using (FileStream fs = new FileStream(Server.MapPath("~/TicketUploads/" + fileName), chunk == 0 ? FileMode.Create : FileMode.Append)) { Byte[] buffer = new Byte[fileUpload.InputStream.Length]; fileUpload.InputStream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, buffer.Length); fs.Close(); } 

首先,我已经设置了Pluploadconfiguration,如下所示:

 $("#plupload_container").pluploadQueue({ runtimes: 'html5,gears,flash,silverlight,html4', flash_swf_url: '../plupload/js/plupload.flash.swf', silverlight_xap_url: '../plupload/js/plupload.silverlight.xap', filters: [ { title: "Image files", extensions: "jpg,gif" }, { title: "Zip files", extensions: "zip" }, { title: "Document files", extensions: "doc,pdf,txt" } ] }); 

…但我觉得我错过了上传工作所必需的东西。

我想我的主要问题是如何调用上面的C#代码,以便上传可以开始? 我在名为SubmitRequest.aspx的页面上有一个表单。 点击表单上的“提交”,结果如下:

 $('form').submit(function (e) { // 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(); } e.preventDefault(); } }); 

…所以上传者在点击“提交”时启动并上传文件。 一旦完成,表单的其余部分将被提交。 我不明白如何将此事件链接到将处理上传到服务器上的文件夹TicketUploads的C#代码。

我很抱歉的post,但我将不胜感激任何帮助:)

这是我为你写的一个完整的工作例子:

 <%@ Page Title="Home Page" Language="C#" %> <%@ Import Namespace="System.IO" %> <script runat="server" type="text/c#"> protected void Page_Load(object sender, EventArgs e) { // Check to see whether there are uploaded files to process them if (Request.Files.Count > 0) { int chunk = Request["chunk"] != null ? int.Parse(Request["chunk"]) : 0; string fileName = Request["name"] != null ? Request["name"] : string.Empty; HttpPostedFile fileUpload = Request.Files[0]; var uploadPath = Server.MapPath("~/TicketUploads"); using (var fs = new FileStream(Path.Combine(uploadPath, fileName), chunk == 0 ? FileMode.Create : FileMode.Append)) { var buffer = new byte[fileUpload.InputStream.Length]; fileUpload.InputStream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, buffer.Length); } } } </script> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head id="Head1" runat="server"> <title></title> <style type="text/css">@import url(css/plupload.queue.css);</style> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript"> google.load("jquery", "1.3"); </script> <script type="text/javascript" src="/plupload/js/gears_init.js"></script> <script type="text/javascript" src="http://bp.yahooapis.com/2.4.21/browserplus-min.js"></script> <script type="text/javascript" src="/plupload/js/plupload.full.min.js"></script> <script type="text/javascript" src="/plupload/js/jquery.plupload.queue.min.js"></script> <script type="text/javascript"> $(function() { $("#uploader").pluploadQueue({ // General settings runtimes : 'gears,flash,silverlight,browserplus,html5', url : '/default.aspx', max_file_size : '10mb', chunk_size : '1mb', unique_names : true, // Resize images on clientside if we can resize : {width : 320, height : 240, quality : 90}, // Specify what files to browse for filters : [ {title : "Image files", extensions : "jpg,gif,png"}, {title : "Zip files", extensions : "zip"} ], // Flash settings flash_swf_url : '/plupload/js/plupload.flash.swf', // Silverlight settings silverlight_xap_url : '/plupload/js/plupload.silverlight.xap' }); // 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(); } }); }); </script> </head> <body> <form id="Form1" runat="server"> <div id="uploader"> <p>You browser doesn't have Flash, Silverlight, Gears, BrowserPlus or HTML5 support.</p> </div> </form> </body> </html> 

正如你将会在这个例子中看到的,文件被上传到同一个名为default.aspx页面。 请注意,诸如chunkname类的参数是POST的,因此您不应该使用Request.QueryString来读取它们,而是直接使用Request["chunk"] ,因为它也会查看POST正文。 您还应该确保在根服务器上存在TicketUploads文件夹。

在这个例子中,同一页面default.aspx用于显示上传表单和处理上传。 在现实世界的应用程序中,这不是我会做的事情。 我会build议你使用一个单独的脚本来处理file upload,比如一个通用的http处理器(upload.ashx)。

最后你会注意到我已经使用了一些你可能希望修改的默认设置,并重新configuration插件以适合你的需要。 我只是从文档中获取设置。


更新:

而且,因为我build议使用一个单独的通用http处理程序来处理file upload,可能看起来如此:

 using System.IO; using System.Web; public class Upload : IHttpHandler { public void ProcessRequest(HttpContext context) { int chunk = context.Request["chunk"] != null ? int.Parse(context.Request["chunk"]) : 0; string fileName = context.Request["name"] != null ? context.Request["name"] : string.Empty; HttpPostedFile fileUpload = context.Request.Files[0]; var uploadPath = context.Server.MapPath("~/TicketUploads"); using (var fs = new FileStream(Path.Combine(uploadPath, fileName), chunk == 0 ? FileMode.Create : FileMode.Append)) { var buffer = new byte[fileUpload.InputStream.Length]; fileUpload.InputStream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, buffer.Length); } context.Response.ContentType = "text/plain"; context.Response.Write("Success"); } public bool IsReusable { get { return false; } } } 

现在剩下的就是重新configuration插件指向这个通用处理程序:

 ... runtimes: 'gears,flash,silverlight,browserplus,html5', url: '/upload.ashx', max_file_size: '10mb', ... 

这是一个用于pluploader的ashx文件的VB示例。

感谢@@ Darin Dimitrov谁提出这个build议。 它是有史以来最好的解决scheme,像silverlight,flash等许多倒退。它的巨型!

我没有find任何VB的例子,所以我转换它我自测和工作! 随着组块!

在VisualStudio中添加一个ashx文件到你的网站。 右键单击该网站

网站>添加新项目>通用处理程序

这一切都在一个页面中,不需要代码。 只需从pluplaod插件调用

 <%@ WebHandler Language="VB" Class="upload" %> Imports System Imports System.IO Imports System.Web Public Class upload : Implements IHttpHandler 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("~/uploads") 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") End Sub Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return False End Get End Property End Class