Как сделать загрузку файла без обновления страницы или перенаправить в ASP.NET MVC - PullRequest
0 голосов
/ 30 октября 2018

Я загружаю файл, используя вид, связанный с контроллером, однако после загрузки загрузка либо пытается обновить, либо перенаправить, и мне нужно это предотвратить. Можете ли вы указать мне правильное направление, чтобы избежать перенаправления и обновления? Я немного прочитал и подозреваю, что эта строка action="/api/BulkUpload"> может вызывать проблему.

Мой контроллер

using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using Repositories.BulkUpload;
using Repositories.Interfaces.BulkUpload;

namespace SimSentinel.Controllers
{
    //[Authorize]
   public class BulkUploadController : ApiController
   {
      private readonly IBulkUploadRepository _bulkUploadRepository;
      public async Task<HttpResponseMessage> PostFile()
      {
         // Check if the request contains multipart/form-data.
         if (!Request.Content.IsMimeMultipartContent())
         {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
         }

         string root = HttpContext.Current.Server.MapPath("~/Files");
         var provider = new FormDataStreamer(root);

         try
         {
            StringBuilder sb = new StringBuilder(); // Holds the response body 



            // Read the form data and return an async task. 
            await Request.Content.ReadAsMultipartAsync(provider);

            // This illustrates how to get the form data. 
            foreach (var key in provider.FormData.AllKeys)
            {
               foreach (var val in provider.FormData.GetValues(key))
               {
                  sb.Append(string.Format("{0}: {1}\n", key, val));
               }
            }


            // This illustrates how to get the file names for uploaded files. 
            foreach (var file in provider.FileData)
            {
               FileInfo fileInfo = new FileInfo(file.LocalFileName);
               sb.Append(string.Format("Uploaded file: {0} ({1} bytes)\n", fileInfo.Name, fileInfo.Length));
            }
            return new HttpResponseMessage()
            {
               Content = new StringContent(sb.ToString())
            };
         }
         catch (System.Exception e)
         {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
         }

      }

      public class FormDataStreamer : MultipartFormDataStreamProvider
      {
         public FormDataStreamer(string rootPath) : base(rootPath) { }
         public FormDataStreamer(string rootPath, int bufferSize) : base(rootPath, bufferSize) { }
         public override string GetLocalFileName(HttpContentHeaders headers)
         {
            var srcFileName = headers.ContentDisposition.FileName.Replace("\"", "");
            return Guid.NewGuid() + Path.GetExtension(srcFileName);
         }
      }





   }
}

МОЙ HTML

 <form name="form1" method="post" enctype="multipart/form-data" action="/api/BulkUpload">
         <div>
            <label for="caption">Image Caption</label>
            <input name="caption" type="text" />
         </div>
         <div>
            <label for="image1">Image File</label>
            <input name="image1" type="file" />
         </div>
         <div>
            <input type="submit" value="ok" />
         </div>
      </form>

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Большое спасибо за помощь, она направила меня в правильном направлении. В конце концов я получил ответ от этого [ Как отправить HTML-форму без перенаправления? . Подход Iframe - это самый простой подход, который является временным исправлением, поскольку в некоторых статьях говорится, что, хотя он по-прежнему поддерживается большинством современных браузеров, он устарел.

0 голосов
/ 30 октября 2018

Ты прав. Когда вы отправляете форму, файл отправляется на контроллер через HTTP-запрос POST, и страница либо обязательно обновляется, либо перенаправляется. Если вы не хотите, чтобы страница обновлялась или перенаправлялась, вам придется использовать AJAX для отправки файла на контроллер.

Из документа Mozilla Developer по HTTP-запросам ,

Метод GET запрашивает представление указанного ресурса. Запросы, использующие GET , должны получать только данные.

Метод POST используется для отправки объекта в указанный ресурс, часто вызывая изменение в состоянии или побочные эффекты на сервер.

Из этих заметок Веб-программирование из Технологического университета Наньян ,

[The] POST метод запроса используется для «отправки» дополнительных данных на сервер (например, отправка данных формы HTML или загрузка файла). Выдача HTTP URL из браузера всегда вызывает запрос GET . Для запуска POST запрос, вы можете использовать форму HTML с атрибутом method = "post" или написать свою собственную сетевую программу. Для отправки данных формы HTML, POST запрос такой же, как запрос GET, за исключением того, что URL-кодированный Строка запроса отправляется в теле запроса, а не добавляется позади URI запроса.

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

Чтобы избежать этого, вы можете использовать jQuery для асинхронной отправки файла на сервер без обновления страницы. Есть много статей о том, как это сделать. Я предлагаю вам попробовать и опубликовать еще один вопрос, если вы застряли.

...