すべてを適切に機能させることができたので、更新されたコードでポストバックしたかっただけです。ファイルのアップロードを処理するために別の汎用httpハンドラーを使用するというDarin Dimitrovの提案を使用したので、これはそのために思いついたコードです...質問がある場合はお知らせください。
<%@ 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 ファイルアップローダーをC#を使用してASP.NETに統合しようとしています。 Angry Monkeysの記事 と 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();
}
まず、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();
}
});
...したがって、「送信」をクリックするとアップローダーが起動し、ファイルがアップロードされます。それが完了すると、フォームの残りの部分が送信されます。このイベントをサーバー上のフォルダーTicketUploads
へのアップロードを処理するC#コードにリンクする方法がわかりません。
投稿が長かったことをお詫びしますが、ご協力いただければ幸いです。
これは私があなたのために書いた完全に機能する例です:
<%@ 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
という同じページにアップロードされます。 chunk
やname
などのパラメータはPOSTされるため、Request.QueryString
を使用してそれらを読み取ることはできませんが、Request["chunk"]
を直接使用すると、POST本文も同様です。ルートのサーバーにTicketUploads
フォルダーが存在することも確認する必要があります。
この例では、同じページdefault.aspxがアップロードフォームの表示とアップロードの処理に使用されています。実際のアプリケーションでは、これは私が行うことではありません。一般的なhttpハンドラー(upload.ashx)など、ファイルのアップロードを処理する別のスクリプトを使用することをお勧めします。
最後に、必要に応じてプラグインを変更および再構成したい場合があるいくつかのデフォルト設定を使用していることがわかります。ドキュメントから設定を取得しました。
更新:
ファイルのアップロードを処理するために別の汎用httpハンドラーを使用することをお勧めしたので、次のようになります。
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; }
}
}
あとは、プラグインを再構成して、この汎用ハンドラーを指すようにするだけです。
...
runtimes: 'gears,flash,silverlight,browserplus,html5',
url: '/upload.ashx',
max_file_size: '10mb',
...
ここにVB pluploaderのashxファイルの例があります。
@@ Darin Dimitrovに感謝だれがこれを提案したか。 Silverlight、フラッシュなどの多くのフォールバックを備えた、これまでで最高のソリューションです。
VBの例は見つからなかったので、自分でテストして機能させました!チャンクで!
VisualStudioでWebサイトにashxファイルを追加するには。ウェブサイトを右クリック
ウェブサイト>新しいアイテムを追加>汎用ハンドラー
これはすべて1つのページにあり、コードビハインドは必要ありません。これを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