对于网络浏览器(例如Chrome,IE或Firefox),当您使用“选择文件”按钮选择文件时,文件的数据存储在何处?
文件名显示在浏览器中,但文件的数据是否存储在任何地方,或者只是放在某处的文件的链接,例如在浏览器或临时文件中?
澄清一下:我想知道在提交之前文件的数据存储在哪里。从客户端的PC中选择文件后,其他任何事情都没有完成。
答案 0 :(得分:0)
选择文件后。我相信客户端(浏览器)只是存储对用户计算机上文件位置的引用。它需要js和html的组合才能将文件发布到服务器。通过Multi / form-data Post。
在这种情况下,在服务器上,您可能必须将文件存储到您选择的临时位置,直到您能够处理它(即转换和/或存储到数据存储区)。
在较新的浏览器中,您可以使用FormData对象和xhr发布到更清洁的服务器。 此FormData对象用于构造键/值对,这些键/值对构成xhr请求的数据有效负载。
// Create a new FormData object.
var formData = new FormData();
在这种情况下,一旦将文件字节发布到服务器,您就可以使用该数据执行任何操作。通常我会将它作为blob存储在DB中。
这种方法可以让你把它全部留在内存中。人们犯了试图存储在服务器文件系统上的错误。但是,在某些多部分表单中,您可能必须这样做。
使用XHR时,这是我的一些web api上传代码。 我也使用iframe(唉!)来调用这个API路由,以支持IE8及更早版本。 POS浏览器!
/// <summary>
/// Upload the facility logo.
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("logo")]
public HttpResponseMessage Logo()
{
int newImageId = -1;
var uploadedFiles = HttpContext.Current.Request.Files;
if (uploadedFiles.Count > 0)
{
var file = uploadedFiles[0];
if (!file.IsImage())
{
// "The uploaded file must be a .jpg, .jpeg, or .png"
return
Request.CreateResponse(HttpStatusCode.UnsupportedMediaType,
"unsupported");
}
var facilityRepository = new FacilityRepository();
var logoBytes =
StreamCopier.StreamToByteArray(file.InputStream, file.ContentLength);
newImageId = facilityRepository.InsertLogoImage(logoBytes);
}
return Request.CreateResponse(HttpStatusCode.OK,
newImageId);
}