没有从文件上传中接收任何数据

时间:2018-05-31 14:42:53

标签: c# file-upload asp.net-core asp.net-core-2.0 bootstrap-file-upload

我正在尝试使用Krajee Bootstrap File Input上传文件。我正在使用ASP.NET Core 2.这是我的HTML:

<input id="fileFileUpload" type="file" />

这是我的javascript代码:

    $("#fileFileUpload").fileinput({
        showPreview: true,
        uploadAsync: false,
        uploadUrl: '/fileupload'
    });

这是我的控制器代码:

[HttpPost]
public JsonResult Index(List<IFormFile> files)
{
    // Do stuff
}

我在我的控制器方法上设置断点,并且断点正在被击中。但files为空。如何检索上传的文件?

2 个答案:

答案 0 :(得分:2)

我可以看到该代码不起作用的首要原因是您的输入未分配名称。

<input id="fileFileUpload" name="files" type="file" />

除此之外,您可以关注this MSDN文章。

答案 1 :(得分:0)

您可以从另一个按钮访问文件,然后像往常一样使用ajax发布文件。 ButtonFileUpload8是新按钮的ID,file-8是文件上传控件的ID。您必须禁用上传按钮

这不是完美的代码,我只是将它们放在一起以展示其效果。

HTML:

    <form enctype="multipart/form-data">
        <div class="row mb-2">
            <div class="col-md-8">
                <div class="file-loading">
                    <input id="file-8" type="file" multiple>
                </div>
            </div>
        </div>
        <div class="btn-group btn-group-sm mr-1" role="group">
            <button id="ButtonFileUpload8" type="button" class="btn btn-sm">
                Blue
            </button>
        </div>

    </form>

JavaScript(请注意,这会忽略启动程序中设置的发布URL,因此会调用FileUploadKrajee并使用Ajax):

    $("#file-8").fileinput({
        uploadUrl:"@Url.Action("FileUploadKrajee", "App")",
        uploadAsync: true,
        minFileCount: 1,
        maxFileCount: 5,
        overwriteInitial: false,
        initialPreview: "",
        initialPreviewConfig: "",
        uploadExtraData: "",
        showUpload: false
    });

    //  Click of upload button

    $("#ButtonFileUpload8").click(function () {
        var control = document.getElementById("file-8");
        var files = control.files;
        var formData = new FormData();

        for (var i = 0; i != files.length; i++) {
            formData.append("files", files[i]);
        }

        $.ajax({
            url: 'UploadFiles3',
            type: "POST",
            contentType: false, // Do not set any content header
            processData: false, // Do not process data
            data: formData,
            async: false,
            success: function (result) {
                if (result != "") {
                    alert(result);
                }
                control.files.value("");
            },
            error: function (err) {
                alert(err.statusText);
            }
        });
    });

然后在接收控制器中可以使用:

    public ActionResult UploadFiles3(List<IFormFile> files)
    {
        string nams = "";
        string funame = "";

        foreach (IFormFile source in files)
        {
            string filename = ContentDispositionHeaderValue.Parse(source.ContentDisposition).FileName.ToString();

            filename = this.EnsureCorrectFilename(filename);

            nams = nams + source.FileName.ToString();

            funame = "D:\\Data\\PointsAlign\\Core\\" + filename;

            FileStream output = System.IO.File.Create(funame);

            source.CopyTo(output);
        }

        return Json("Hi, Alster. Your files uploaded successfully " + nams);

    }

这确实有效,但是我还没有针对任何问题进行压力测试