在 Asp.Net Core 中,如何从 body 中获取 multipart/form-data?
In Asp.Net Core, how can I get the multipart/form-data from the body?
在 Asp.Net Core 中,他们似乎已经取消了 Request.Content.ReadAsMultipartAsync
功能以支持 IFormFile。
这使得在您拥有实际文件的地方上传更容易,但是,我有一个用例,我需要将文件上传到浏览器内存,处理它,然后将其作为 multi-form body 中的数据。 IFormFile 看不到它,因为没有实际文件可供读取。仅当您在 Content-Disposition 上有一个文件名 属性 并且在客户端上有一个要上传的实际文件时才有效。
在我的 Asp.Net 4 应用程序中,我可以读取 body 中的多部分数据,无论这些数据是在边界之间发送的还是作为附件发送的。
如何在 .Net Core 中完成此操作?
我已经这样做了。当我不得不从网络摄像头捕获图像并在浏览器内存中处理(在浏览器中显示该图像)时,稍后 post 使用表单处理该图像。
public IActionResult Index()
{
var files = HttpContext.Request.Form.Files;
if (files != null)
{
foreach (var file in files)
{
var fileName = file.Name;
}
}
return View();
}
我使用 JS 库 Webcam.js 从网络摄像头捕获图像并在同一页面上显示该图像。一旦用户对图片感到满意,s/he 就可以将图片上传到服务器。
<!-- Configure settings and attach camera -->
<script language="JavaScript">
Webcam.set({
width: 320,
height: 240,
image_format: 'jpeg',
jpeg_quality: 90
});
Webcam.attach('#camera');
</script>
<!-- handle snapshot and displaying it locally -->
<script language="JavaScript">
function take_snapshot() {
// take snapshot and get image data
Webcam.snap(function (data_uri) {
// display results in page
document.getElementById('imageResults').innerHTML =
'<img src="' +
data_uri +
'"/>';
Webcam.upload(data_uri,
'/Default/Index',
function (code, text) {
console.log('Photo Captured');
});
});
}
</script>
<div class="panel panel-default">
<div class="panel-heading">Camera</div>
<div class="panel-body">
<div id="camera"></div>
<!-- A button for taking snaps -->
<form>
<input type="button" class="btn btn-success" value="Take Snapshot" onClick="take_snapshot()">
</form>
<div class="panel panel-default">
<div class="panel-heading">Captured Image</div>
<div class="panel-body">
<div id="imageResults">captured image will appear here...</div>
</div>
<br />
<br />
</div>
如果这就是您要找的,请告诉我。
我发现多部分值作为 key/value 对的数组传递到 HttpRequest.Form 中。正文多部分的 "name" 值决定键的名称。
我创建了一个辅助方法来获取文件和表单值。
public static List<FileModel> GetFileModelsFromRequest(HttpRequest request)
{
var fileModels = new FileModels();
foreach (var formField in request.Form)
{
// Form data
var fileModelText = formField.Value;
... process and add to the FileModel list
}
if (request.Form.Files != null && request.Form.Files.Count > 0)
{
foreach (var file in request.Form.Files)
{
using (MemoryStream ms = new MemoryStream())
{
// File data
formFile.CopyTo(ms);
}
... process and add to the FileModel list
}
}
return fileModels;
}
在 Asp.Net Core 中,他们似乎已经取消了 Request.Content.ReadAsMultipartAsync
功能以支持 IFormFile。
这使得在您拥有实际文件的地方上传更容易,但是,我有一个用例,我需要将文件上传到浏览器内存,处理它,然后将其作为 multi-form body 中的数据。 IFormFile 看不到它,因为没有实际文件可供读取。仅当您在 Content-Disposition 上有一个文件名 属性 并且在客户端上有一个要上传的实际文件时才有效。
在我的 Asp.Net 4 应用程序中,我可以读取 body 中的多部分数据,无论这些数据是在边界之间发送的还是作为附件发送的。
如何在 .Net Core 中完成此操作?
我已经这样做了。当我不得不从网络摄像头捕获图像并在浏览器内存中处理(在浏览器中显示该图像)时,稍后 post 使用表单处理该图像。
public IActionResult Index()
{
var files = HttpContext.Request.Form.Files;
if (files != null)
{
foreach (var file in files)
{
var fileName = file.Name;
}
}
return View();
}
我使用 JS 库 Webcam.js 从网络摄像头捕获图像并在同一页面上显示该图像。一旦用户对图片感到满意,s/he 就可以将图片上传到服务器。
<!-- Configure settings and attach camera -->
<script language="JavaScript">
Webcam.set({
width: 320,
height: 240,
image_format: 'jpeg',
jpeg_quality: 90
});
Webcam.attach('#camera');
</script>
<!-- handle snapshot and displaying it locally -->
<script language="JavaScript">
function take_snapshot() {
// take snapshot and get image data
Webcam.snap(function (data_uri) {
// display results in page
document.getElementById('imageResults').innerHTML =
'<img src="' +
data_uri +
'"/>';
Webcam.upload(data_uri,
'/Default/Index',
function (code, text) {
console.log('Photo Captured');
});
});
}
</script>
<div class="panel panel-default">
<div class="panel-heading">Camera</div>
<div class="panel-body">
<div id="camera"></div>
<!-- A button for taking snaps -->
<form>
<input type="button" class="btn btn-success" value="Take Snapshot" onClick="take_snapshot()">
</form>
<div class="panel panel-default">
<div class="panel-heading">Captured Image</div>
<div class="panel-body">
<div id="imageResults">captured image will appear here...</div>
</div>
<br />
<br />
</div>
如果这就是您要找的,请告诉我。
我发现多部分值作为 key/value 对的数组传递到 HttpRequest.Form 中。正文多部分的 "name" 值决定键的名称。
我创建了一个辅助方法来获取文件和表单值。
public static List<FileModel> GetFileModelsFromRequest(HttpRequest request)
{
var fileModels = new FileModels();
foreach (var formField in request.Form)
{
// Form data
var fileModelText = formField.Value;
... process and add to the FileModel list
}
if (request.Form.Files != null && request.Form.Files.Count > 0)
{
foreach (var file in request.Form.Files)
{
using (MemoryStream ms = new MemoryStream())
{
// File data
formFile.CopyTo(ms);
}
... process and add to the FileModel list
}
}
return fileModels;
}