ОБНОВЛЕНИЕ
Мне удалось заставить все работать должным образом, и я просто хотел отправить обратно с обновленным кодом.Я использовал предложение Дарина Димитрова об использовании отдельного универсального обработчика http для обработки загрузки файлов, и вот код, который я придумал для этого ... дайте мне знать, если у вас есть вопросы.
<%@ 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;
}
}
Я пытаюсь интегрировать загрузчик файлов Plupload в ASP.NET, используя C #.Я прочитал Angry Monkeys статью , а также пост в блоге Марко Вальсекки , но я немного растерялся.
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();
}
Сначала я настроил конфигурацию Plupload следующим образом:
$("#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();
}
});
... поэтому загрузчик запускается при нажатии «Отправить» и загружает файлы.Как только это будет сделано, остальная часть формы будет отправлена.Я не понимаю, как связать это событие с кодом C #, который будет обрабатывать загрузку в папку TicketUploads
на сервере.
Я прошу прощения за длинный пост, но я был бы признателен за любую помощь :)