我正在通过链接到控制器的视图上载文件,但是上载后,应用程序正在尝试刷新或重定向,因此我需要防止这种情况。您能否为我指出正确的方向,以避免重定向和刷新?我做了一些阅读,我怀疑这行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>
答案 0 :(得分:3)
您是正确的。提交表单时,文件将通过HTTP POST请求发送到控制器,并且页面必须进行刷新或重定向。如果您不希望页面刷新或重定向,则必须使用AJAX将文件发布到控制器。
从Mozilla Developer document on HTTP requests
GET 方法请求表示指定资源。 使用 GET 的请求应仅检索数据。
POST 方法用于将实体提交到指定的 资源,通常会导致状态变化或副作用 服务器。
摘自Web Programming from Nanyang Technological University上的这些注释,
[The] POST 请求方法用于将其他数据“发布”到服务器 (例如,提交HTML表单数据或上传文件)。发出HTTP 来自浏览器的URL始终会触发 GET 请求。触发 POST 请求,您可以使用属性为method =“ post”的HTML表单,或者 编写自己的网络程序。要提交HTML表单数据,请 POST 请求与GET请求相同,除了URL编码 查询字符串在请求正文中发送,而不是附加在后面 请求URI。
因此,您可以看到,由于您是使用标准HTTP请求将文件发布到服务器的,因此有必要以某种方式刷新或重定向。
为避免这种情况,您可以使用jQuery将文件异步发布到服务器,而无需刷新页面。关于如何执行此操作的文章很多。我建议您尝试一下,如果遇到问题,请发布另一个问题。
答案 1 :(得分:0)
非常感谢它为我指引了正确的方向。我最终从此[How to submit html form without redirection?中得到了答案。 Iframe方法是最简单的方法,它是一个临时修复程序,因为有些文章说,尽管大多数现代浏览器仍支持它,但已弃用它。