4

ASP.net 4 Web サービス WebMethod への FormData の jQuery AJAX ポストの処理に問題があります。

<input id="ipt_file" type="file" />
<a href='#' onclick="UploadFile();" data-role='button'>Upload</a>

var UploadFile = function () {
    var file_object = $('#ipt_file')[0].files[0];
    var form_data = new FormData();
    form_data.append('job_id', '123456');
    form_data.append('job_name', 'xyx');
    form_data.append('job_file', file_object);

    var xhr_upload = $.ajax({
        type: "POST",
        headers: { "Cache-Control":"no-cache", "Content-Type":"multipart/form-data" }, // also tried without these
        url: "../MyServices.asmx/Upload",
        data: form_data,
        processData: false,
        contentType: false,
        dataType: "json",
        success: function (msg) {
            if (typeof (msg) === "object") {
                var _upload = $.parseJSON(msg.d);
                alert(_upload.status + ': ' + _upload.msg);
            };
        }
    });
};

public class FileUploadRequest
{
    public string job_id { get; set; }
    public string job_name { get; set; }
    public HttpPostedFile job_file { get; set; }
}

[WebMethod]
public string Upload(FileUploadRequest x)
{
    string str_response = string.Empty;
    if (x.job_file.ContentLength > 0)
    {
        str_response = "{\"status\":1,\"msg\":\"" + x.job_id + ", " + x.job_name + ", " + x.job_file.FileName + "\"}";
    }
    else
    {
        str_response = "{\"status\":0,\"msg\":\"FAIL"\}";
    };
    return str_response;
}

FormData オブジェクト パラメーターを適切に処理してはなりません。ここでカスタム クラスをインスタンス化しましたが、サーバーから返されるのは 500 エラーだけです (汎用オブジェクト x も試しました)。また、いくつかの投稿で見たように、それを HttpRequest オブジェクトとして処理しようとしましたが、役に立ちませんでした。この場合、IE 9 との非互換性は気にしません。単一のファイルのアップロード、または少なくとも asmx WebMethod によって適切に受信されたキーと値のペアを持つ FormData オブジェクトを確認したいだけです。

4

2 に答える 2

6

誰かが見たい場合に備えて、次のコードで動作するようにしました。

    var upload_file = $('#ipt_file')[0].files[0];
    var upload_filename = upload_file.name;
    var upload_maxsize = 10485760;
    var upload_projectname = "test";
    var form_data = new FormData();
    form_data.append('session_id', this.sessionID());
    form_data.append('project_name', upload_projectname);
    form_data.append('file_name', upload_filename);
    form_data.append('file_size', upload_file.size);
    form_data.append('file', upload_file);
    if (upload_file.size < upload_maxsize) {
    var xhr_upload = $.ajax({
        type: "POST",
        headers: { 'Cache-Control': 'no-cache' },
        url: "../services/upload.ashx",
        data: form_data,
        processData: false,
        contentType: false,
        dataType: "json"
        }
    })
    .done(function (xhr_data) {
        ...
    })
    .fail(function (jqXHR, textStatus, errorThrown) {
        ...
    })
    .always(function () {
        ...
    });
于 2014-10-09T14:37:45.310 に答える
5

.NET は、コンテンツ タイプのmultipart/form-dataを許可しません。

JSON ハイジャックと、ASP.NET AJAX 1.0 がこれらの攻撃を回避する方法

ASP.NET が GET ベースと POST ベースの両方の ASP.NET AJAX Web メソッドに適用する組み込みの検証レイヤーがあります。つまり、使用されている HTTP 動詞に関係なく、SP.NET は常に HTTP コンテンツを要求します。タイプ ヘッダーは値 application/json に設定されます。このコンテンツ タイプ ヘッダーが送信されない場合、ASP.NET AJAX はサーバー上の要求を拒否します。

于 2014-10-09T08:22:45.703 に答える