35

私は、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>

すべてがうまくいっているようです。お気付きのように、"script" 属性は配置コントローラーとアップロード アクションである /Placement/Upload に設定されています。

主な問題は、ファイルを受信するためにこのアクションを起動するのが難しいことです。そのアクションにブレークポイントを設定しましたが、アップロードするファイルを選択しても実行されません。

この記事に基づいてメソッドのシグネチャを変更してみました:

public string Upload(HttpPostedFileBase FileData)
{
    /*
    *
    * Do something with the FileData
    *
    */
    return "Upload OK!";
}

しかし、これはまだ発火しません。

実際に起動するように、アップロードコントローラーアクションの署名を正しく記述して取得するのを手伝ってくれる人はいますか? その後、ファイル データを自分で処理できます。メソッドアクションを起動するための助けが必要です。

4

6 に答える 6

20
public string Upload(HttpPostedFileBase FileData) {}

正解です。uploadify によってアップロードされたファイルは、FileData にバインドされます。ファイルを取得するために Request.Files にアクセスする必要はありません。これにより、モックとテストが難しくなります。

アクションがまったく実行されない場合 (つまり、デバッグを試みて、メソッド内のブレークポイントがヒットするかどうかを確認します)、問題はおそらく「スクリプト」の値です。仮想ディレクトリの下で実行していますか? その場合は、ディレクトリの名前を前に置く必要があります。Uploadify は絶対パスを使用しています。

つまり、「スクリプト: '/virtual_directory/Placement/Upload'」

現在、uploadify はhttp://localhost/Placement/Uploadに送信しています。

また、ルート デバッガー ( http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx ) を使用して、ルートがマップされている場所を確認してみてください。

于 2009-08-21T01:22:43.630 に答える
10

問題は、アップロード先のアクションが 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 を機能させるためには、それほど重要ではありません。

于 2009-07-15T08:37:46.140 に答える
2

これは、ファイルのアップロードをまったく実装する必要があった方法ではありません。現在の 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 を使用してコントローラーに具体的な実装を挿入する方が簡単です。

これは主に次の投稿に基づいていると思います。テストとモックを含む ASP.NET MVC を使用した HTTP ファイル アップロードの実装

于 2009-06-16T17:01:56.587 に答える
2

これに対する私の完全な解決策は、あなたの問題を解決するかもしれません。それが役に立てば幸い。

http://zootfroot.blogspot.com/2010/12/mvc-file-upload-using-uploadify-with.html

于 2010-12-06T22:19:06.417 に答える
0

これが私の単純なRazor Viewです(レイアウトマスターには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" />
}

これがコントローラーメソッドです

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!");
    }

それでおしまい!

于 2013-09-06T21:48:40.747 に答える
0

ドキュメントを読むと、ファイルの配列を送信しているようです。やってみました:

public string Upload( HttpPostedFileBase[] fileData )

デフォルトのモデル バインダーが HttpPostedFileBase で機能しない可能性もあり、Rory のメカニズムを使用するか、独自のモデル バインダーを作成する必要があります。

于 2009-06-16T17:04:45.943 に答える