dropzone и asp. net core 3.1 - какой параметр следует отправлять на контроллер? - PullRequest
1 голос
/ 10 марта 2020

У меня есть это в моем представлении бритвы:

<div id="dropzone">
<form action="/Controller/Upload" method="post" enctype="multipart/form-data"
      id="my-awesome-dropzone" class="dropzone needsclick dz-clickable dropzone-previews">
    @Html.AntiForgeryToken()
    <div ></div>
    <div class="dz-message needsclick">
        <button type="button" class="dz-button">Drop files here or click to upload.</button><br />
    </div>
    <span class="note needsclick">

    </span>
</form>

и это в моем js:

Dropzone.options.myAwesomeDropzone = {
  paramName: "file", // The name that will be used to transfer the file
  maxFiles: mediaMax,
  maxFilesize: maxSize,
  uploadMultiple: true,
  accept: function (file, done) {
    if (file.name === "justinbieber.jpg") {
        done("Naha, you don't.");
    }
    else { done(); }
},
  init: function () {
    this.on("sending", function (file, response, formData) {
        formData["__RequestAntiForgeryToken"] = document.getElementsByName("__RequestVerificationToken")[1].value;
    });
    this.on("sendingmultiple", function (file, response, formData) {
        formData["__RequestAntiForgeryToken"] = document.getElementsByName("__RequestVerificationToken")[1].value;
    });
    this.on("success", function (file, response) {
        file.serverID = response.id;
    });
    this.on("error", function (file, response) {
        var r = response;
        console.log("Drop Err:");
        console.log(r);
    });
}};

в моем контроллере, я попробовал это :

    [HttpPost]
    [FormAttributes.DisableFormValueModelBinding]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Upload(ICollection<IFormFile> files)

и этот

        [HttpPost]
    [FormAttributes.DisableFormValueModelBinding]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Upload(IFormFile file)

и файл, и файлы возвращают 0 или ноль

работает только

    [HttpPost]
    [FormAttributes.DisableFormValueModelBinding]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Upload(ICollection<IFormFile> files)
    {
        if (ModelState.IsValid)
        {

            var more = HttpContext.Request.Form.Files;
            ... do stuff
        } }

, где я в основном игнорирую входные параметры файлов
Может кто-нибудь сказать мне, что правильные параметры для загрузки?

для ссылки я посмотрел следующие ссылки:
MVC 6 HttpPostedFileBase?
https://dotnetthoughts.net/uploading-images-aspnet-core-and-dropzone/

1 Ответ

1 голос
/ 10 марта 2020

Если у вас есть опция uploadMultiple, установленная на true, тогда Dropzone добавит [] к paramName. Посмотрев на запрос о загрузке нескольких файлов html5, я заметил, что запрос не добавляет индексы к имени файла (files [n]). Dropzone. js делает это, так что есть обходной путь. Если вы добавите параметр paramName в конфигурацию Dropzone JS и вызовете метод, который возвращает файлы, вы получите то же поведение, что и при загрузке нескольких файлов html5. Вы также можете обратиться к этой ссылке для получения дополнительной информации о параметрах конфигурации Dropzone. js

Просмотр бритвы и js

<div id="dropzone">
  <form action="/Home/Upload" method="post" enctype="multipart/form-data"
      id="myAwesomeDropzone" class="dropzone needsclick dz-clickable dropzone-previews">
    @Html.AntiForgeryToken()
    <div></div>
    <div class="dz-message needsclick">
        <button type="button" class="dz-button">Drop files here or click to upload.</button><br />
    </div>
    <span class="note needsclick">

    </span>
</form>

@section Scripts
 {
  <link rel="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.1/dropzone.css" />
  <script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.1/dropzone.js"></script>
  <script>
   function myParamName() {
       return "files";
    }

    Dropzone.options.myAwesomeDropzone = {
    paramName: myParamName, // The name that will be used to transfer the file
    maxFiles: 5,
    maxFilesize: 100,
    uploadMultiple: true,
    accept: function (file, done) {
        if (file.name === "justinbieber.jpg") {
            done("Naha, you don't.");
        }
        else { done(); }
    },
    init: function () {
        this.on("sending", function (file, response, formData) {
            formData["__RequestAntiForgeryToken"] = document.getElementsByName("__RequestVerificationToken").value;
        });
        this.on("sendingmultiple", function (file, response, formData) {
            formData["__RequestAntiForgeryToken"] = document.getElementsByName("__RequestVerificationToken").value;
        });
        this.on("success", function (file, response) {
            file.serverID = response.id;
        });
        this.on("error", function (file, response) {
            var r = response;
            console.log("Drop Err:");
            console.log(r);
        });
    }};
  </script>
}

Контроллер

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Upload(ICollection<IFormFile> files)

Результат enter image description here

...