Извлечение значения Fileupload из значений FormCollection в mvc - PullRequest
2 голосов
/ 15 июля 2011

Я пытаюсь проверить, выбран ли файл в файле загрузки в mvc с использованием коллекции Form, но значения формы всегда равны нулю, fileupload не передает имя загруженного файла в коллекцию форм, ниже приведен код:

   public ActionResult Create(FormCollection formValues,IEnumerable<HttpPostedFileBase> files, Venue venue)
    {
        string[] images = { "", "" };
        int i = 0;
     //   string smallImage;
      //  string largeImage;
        foreach (HttpPostedFileBase file in files)
        {
            if (file != null)
            {
                if (i == 0)
                {

                    string newFileName = string.Format("{0}{1}", Guid.NewGuid().ToString(), Path.GetExtension(file.FileName));
                    var fileName = Path.GetFileName(file.FileName);
                    var path = Path.Combine(Server.MapPath("~/Content/images/content/"), fileName);
                    file.SaveAs(path);
                    Helpers.ImageHelpers.ResizeImage(newFileName, path, "/Content/images/content/", 162, 105);
                    images[0] = newFileName;
                    venue.ImageSmall = images[0];
                //    smallImage = "selected";
                }

                if (i == 1)
                {

                    string newFileName = string.Format("{0}{1}", Guid.NewGuid().ToString(), Path.GetExtension(file.FileName));
                    var fileName = Path.GetFileName(file.FileName);
                    var path = Path.Combine(Server.MapPath("~/Content/images/content/"), fileName);
                    file.SaveAs(path);
                    Helpers.ImageHelpers.ResizeImage(newFileName, path, "/Content/images/content/", 212, 240);
                    images[1] = newFileName;
                    venue.ImageLarge = images[1];
                 //   largeImage = "selected";
                }

            }
            i++;
        }

        if (string.IsNullOrEmpty(formValues["files1"]) || string.IsNullOrEmpty(formValues["files2"])  )
        {

            ModelState.AddModelError("files", "Please upload a file");
        }

      <td>
                        <div class="editor-field">
                            <input type="file" name="files" id="files1" style="color:White" />


                            </div>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            Detail Image
                        </td>
                        <td>
                        <div class="editor-field">
                            <input type="file" name="files" id="files2" style="color:White"/>


                            </div>
                        </td>
                    </tr>

In the keys section there is no formvalue[

Ответы [ 2 ]

4 голосов
/ 15 июля 2011
  1. Вы используете неправильные идентификаторы («files1» и «files2» в html, но «file1» и «file2» в коде)

  2. Четныйесли вы используете правильные идентификаторы, этот код не будет работать, потому что параметры формы именуются с использованием значений из атрибута "name".Таким образом, вы должны создать уникальное имя для каждого входного тега в html, а затем использовать эти имена в коде.

На случай, если вы захотите перебрать файлы.Вы можете присвоить им тот же идентификатор, а затем использовать свойство Request.Files в методе контроллера на стороне сервера.

0 голосов
/ 22 мая 2019

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

Ключевым моментом для меня стало то, что у меня не так много моделей, как у меня.файл BusinessLogicLayer.dll, который служит моими моделями, за исключением некоторых редких исключений, с которыми столкнулся один из программистов в моем проекте.

Эта часть представляет собой форму формы представления с удаленным хорошим фрагментом кода.для краткости за исключением того, что относится к этому вопросу.

<form id="payInfo" name="payInfo" action="@Url.Action("ShipMethod", "CheckOut")" method="post" enctype="multipart/form-data">

    <div id="12" class="custom-control custom-radio">
        <input type="radio" class="custom-control-input" id="payInvoice" name="payMethod" required />
        <!--on submit if this is selected, the customer will see a thank you as well as instructions on when/how the invoice will be available.-->
        <label class="custom-control-label" for="payInvoice">Send Invoice</label>
    </div>

    <div id="invoice" class="collapse img-thumbnail">                               
        <p class="h6 mb-2">You can provide the PO number on your Purchase Order, or you can accept the generated PO number that we have provided for you.</p>

        <div class="form-group row">
            <label for="invoicePO" class="col-2 col-form-label font-weight-bold">po number: </label>
            <div class="col-4"><!--Invoice name/prefill--></div>
            <div class="col-6">&nbsp;</div>
        </div>

        <div class="form-group row">
            <label for="POfile" class="col-2 col-form-label font-weight-bold">PO PDF: </label>
            <div class="col-4"><input type="file" class="form-control-file" id="POfile" name="POfile" /></div>
            <div class="col-6">&nbsp;</div>
        </div>
    </div>

    <button class="btn btn-secondary btn-lg btn-block" type="submit">Continue To Shipping</button>

</form>

Оттуда форма обрабатывается контроллером (с помощью частного метода), как показано в следующем фрагменте кода.(Также отредактировано для краткости и актуальности)

public ActionResult ShipMethod(FormCollection fc)
{
    // Gets the file(s) uploaded by the user using the form
    HttpFileCollectionBase file = Request.Files;

    // In this point I'm only looking for 1 file as that is all the user is allowed to upload
    if (file.Count == 1)
    {
        // This being the reference to the private method mentioned earlier
        /* We're passing the customer's cart and 
         * the file variable that was filled above as the Cart will be constant 
         * until the user confirms their purchase, making it ideal to hold on to 
         * the file details until the purchase is actually processed in the 
         * last step of the check out process. */
        GetPO(_cart, file);
    }
}

Ниже приведен код метода, который фактически обрабатывает загруженный файл.

private void GetPO(Cart _cart, HttpFileCollectionBase file)
{
    // Setting up a regEx to help me to restrict the kinds of files the user can upload to our server
    string fileRegEx = @"^.+\.((pdf))$";
    Regex regex = new Regex(fileRegEx, RegexOptions.IgnoreCase);

    // This gets just the filename and its extension instead of the fully qualified name
    // which we don't want when working with the RegEx comparison
    string fileName = Path.GetFileName(file[0].FileName);

    if (regex.IsMatch(fileName))
    {
        // If we're here, then the file name indicates that the file is a PDF
        if (file != null && file[0].ContentLength > 0)
        {
            // If we're here then there is actual substance to the file that was uploaded
            // So we'll need to make a byte array to temporarily 
            // hold the file contents before storage
            byte[] upload = new byte[file[0].ContentLength];

            // Get the File contents
            file[0].InputStream.Read(upload, 0, file[0].ContentLength);

            // Now that we have the contents, pass those contents on 
            // to the object that will hold onto it till the purchase 
            // is in the final stage of processing
            _cart.POContent = upload;

            // This section will get the other pertinent data pieces for storage
            // Get the index of the last period in the file name
            int lastIndex = fileName.LastIndexOf('.');
            // Get the file extension
            string ext = fileName.Substring(++lastIndex);

            // Get the POName and POContentType
            if (ext.ToLower() == "pdf")
            {
                // Get the Media Content Type
                _cart.POContentType = MediaContentType.PDF;
                // Get the name of the file without the extension
                _cart.POName = fileName.Remove(--lastIndex);
            }
            else
            {
                // TODO: Error handling for the wrong file extension
            }
        }
    }
    else
    {
        // TODO: Set up Error Handling for invalid or empty file
    }
}

Этот фрагмент кода не полностью готов кобщественное потребление, но я знаю, что эта большая часть ДОЛЖНА работать в сочетании с имеющимися у нас BLL и DAL.

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

Это делается с ASP, MVC4, .NET Framework 4.6.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...