jQueryのUploadifyプラグインをASP.NET MVCで動作させるにはどうすればよいですか?
-
05-07-2019 - |
質問
私は、jQueryプラグイン Uploadify を取得してASPを処理しようとしています。 NET MVC。
次のJavaScriptスニペットでプラグインが正常に表示されました:
<script type="text/javascript">
$(document).ready(function() {
$('#fileUpload').fileUpload({
'uploader': '/Content/Flash/uploader.swf',
'script': '/Placement/Upload',
'folder': '/uploads',
'multi': 'true',
'buttonText': 'Browse',
'displayData': 'speed',
'simUploadLimit': 2,
'cancelImg': '/Content/Images/cancel.png'
});
});
</script>
すべてがうまくいっているように思えます。気づいたら、&quot;スクリプト&quot;属性は/ Placement / Uploadに設定されます。これは、プレースメントコントローラとアップロードアクションです。
主な問題は、このアクションを起動してファイルを受信するのが難しいことです。そのアクションにブレークポイントを設定しましたが、アップロードするファイルを選択しても実行されません。
に基づいてメソッドシグネチャを変更しようとしました。この記事:
public string Upload(HttpPostedFileBase FileData)
{
/*
*
* Do something with the FileData
*
*/
return "Upload OK!";
}
しかし、これはまだ起動しません。
実際に実行されるように、アップロードコントローラーアクションの署名を正しく作成して取得するのを手伝ってもらえますか?その後、自分でファイルデータを処理できます。メソッドアクションを起動するための手助けが必要です。
解決
public string Upload(HttpPostedFileBase FileData) {}
が正しい-uploadifyによってアップロードされたファイルはFileDataにバインドされます。ファイルを取得するためにRequest.Filesにアクセスする必要はありません。これにより、モックとテストが難しくなります。
アクションがまったく起動しない場合(つまり、デバッグを試みてメソッド内のブレークポイントにヒットするかどうかを確認する)、問題はおそらく「スクリプト」値です-仮想ディレクトリの下で実行していますか?その場合、ディレクトリの名前を前に置く必要があります。 Uploadifyは絶対パスを使用しています。
i.e。 'script:' / virtual_directory / Placement / Upload '
現在、uploadifyは http:// localhost / Placement / Upload に送信しています。
ルートデバッガーを使用してみてください( http:// haacked .com / archive / 2008/03/13 / url-routing-debugger.aspx )を使用して、ルートがマップされている場所を確認します。
他のヒント
問題は、アップロード先のアクションがPost ...に設定されていることを指定する必要があることかもしれません... Getアクションとしてのアクションでは動作しません。
だから、これ:
public string Upload(HttpPostedFileBase FileData)
{
//do something
}
これになります:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Upload(HttpPostedFileBase FileData)
{
//do something
}
また、「ログイン」でこれを使用している場合は、サイトのセクションで、uploadifyと認証に関する既知のバグを確認する必要があります。 http://geekswithblogs.net/apopovsky/archive/2009/05/06/working-around-flash-cookie-bug-in-asp .net-mvc.aspx
また、MVCにはファイルのアップロードを処理するいくつかの方法があります(Rory Fitzpatrickの提案に従ってRequest.Filesを使用し、アクション定義の引数としてHttpPostedFileBaseファイルを渡す)。 Uploadifyを機能させるために、それは本当に重要ではありません。
これは、ファイルのアップロードを実装する必要がなかった方法です。現在のRequestオブジェクトを使用して、投稿されたファイルのコレクションに飛び込むパラメーターのないアクションメソッドがありました。
実装のサンプルコード:
[AcceptVerbs(HttpVerbs.Post)]
public ContentResult Upload() {
if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0) {
HttpPostedFileBase postedFile = Request.Files[0];
// Do something with it
}
}
もちろん、このためのテストを書くことはPITAになります。動作させるには、いくつかのオブジェクトをモックする必要があります。例:
var mockHttpContext = mocks.StrictMock<HttpContextBase>();
var mockRequest = mocks.StrictMock<HttpRequestBase>();
var postedFile = mocks.StrictMock<HttpPostedFileBase>();
var postedFileKeyCollection = mocks.StrictMock<HttpFileCollectionBase>();
mockHttpContext.Expect(x => x.Request).Return(mockRequest).Repeat.Any();
mockRequest.Expect(x => x.Files).Return(postedFileKeyCollection).Repeat.Any();
postedFileKeyCollection.Expect(x => x[0]).Return(postedFile).Repeat.Any();
postedFileKeyCollection.Expect(x => x.Count).Return(1);
postedFile.Expect(f => f.ContentLength).Return(1024);
postedFile.Expect(f => f.InputStream).Return(null);
IoCを使用してコントローラーに具体的な実装を注入することで、投稿されたファイルへのインターフェイスを作成し、それを模擬する方が簡単です。
これは主に次の投稿に基づいていると思います。テストとモックを含むMVC
これに対する私の完全な解決策はあなたの問題を解決するかもしれません。役に立てば幸いです。
http://zootfroot.blogspot。 com / 2010/12 / mvc-file-upload-using-uploadify-with.html
ドキュメントを読むと、ファイルの配列を送信しているようです。試しましたか:
public string Upload( HttpPostedFileBase[] fileData )
デフォルトのモデルバインダーがHttpPostedFileBaseで動作しない可能性もあり、Roryのメカニズムを使用するか、独自のモデルバインダーを作成する必要があります。
これは私のシンプルなRazorビューです(レイアウトマスターにはJavascriptバンドルがあります)
@{
ViewBag.Title = "Upload Email CSV";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<script type="text/javascript" src="@Url.Content("~/Scripts/Uploadify/jquery.uploadify.js")"></script>
<script type="text/javascript">
$(function () {
var uploadUrl = "@Url.Content("~/UploadFile/UploadEmailCSV/")";
var uploadSWF = "@Url.Content("~/Scripts/Uploadify/uploadify.swf")";
var uploadifyButtonImage = "@Url.Content("~/Scripts/Uploadify/uploadify.swf")";
$('#file_upload').uploadify({
'fileSizeLimit': '0',
'buttonImage': '/uploadify/browse-btn.png',
'swf': uploadSWF,
'uploader': uploadUrl,
'onUploadSuccess': function(file, data, response) {
alert('The file was saved to: ' + data);
}
});
});
</script>
<h2>Upload a comma separated list of email addresses</h2>
@using (Html.BeginForm("UploadEmailCSV", "UploadFile", FormMethod.Post, new { @class = "form-horizontal", @enctype = "multipart/form-data", @id = "frmUploadFiles" }))
{
<input type="file" name="file_upload" id="file_upload" />
}
これはContollerメソッドです
public ActionResult UploadEmailCSV()
{
var uploadedFile = Request.Files["Filedata"];
if (uploadedFile != null && uploadedFile.ContentLength > 0)
{
var filePath = Path.Combine(Server.MapPath("~/UploadedFiles"), string.Format("{0}_{1}{2}", Path.GetFileNameWithoutExtension(uploadedFile.FileName), DateTime.Now.Ticks, Path.GetExtension(uploadedFile.FileName)));
uploadedFile.SaveAs(filePath);
return Content(string.Format("{0}_{1}{2}", Path.GetFileNameWithoutExtension(uploadedFile.FileName), DateTime.Now.Ticks, Path.GetExtension(uploadedFile.FileName)));
}
return Content("Error Uploading file!");
}
これで終わりです!