То, что я сейчас использую для обработки файловых загрузок от пользователя через многокомпонентную форму, - это следующий код.
Ключевым моментом для меня стало то, что у меня не так много моделей, как у меня.файл 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"> </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"> </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