我有一个控制器,它接收一个HttpPostedFileBase(.jpg或.png等)。
public ActionResult SaveImage(HttpPostedFileBase ImageData)
{
//code
}
ImageData
成为具有以下属性的System.Web.HttpPostedFileWrapper
对象:
ContentLength: 71945
ContentType: "image/png"
FileName: "foo.png"
InputStream: {System.Web.HttpInputStream}
我在使用ImageData并将其转换为Image,然后将Image转换为byte []然后转换为base64字符串时没有任何问题 - 但我尝试将其直接转换为byte []使用以下代码:
byte[] imgData;
using (Stream inputStream = ImageData.InputStream)
{
MemoryStream memoryStream = inputStream as MemoryStream;
if (memoryStream == null)
{
memoryStream = new MemoryStream();
inputStream.CopyTo(memoryStream);
}
imgData = memoryStream.ToArray();
}
memoryStream
在调用imgData = memoryStream.ToArray();
时始终为空,因此imgData
最终也为空。
我很难理解为什么我无法将此InputStream读入MemoryStream。除了抛出timeouts are not supported on this stream
的readTimeout和writeTimeout属性之外,InputStream看起来似乎很好。我做错了什么,为什么我不能将ImageData转换为byte []?
以防万一,这是我的AJAX电话。将contentType
或processData
选项设置为false可能会出现问题吗?
$.ajax({
url: 'SaveImage',
data: formData,
type: "POST",
contentType: false,
processData: false,
beforeSend: function () {
$("#loadingScreenModal").modal('toggle');
},
success: function (data) {
// etc.
}
});
更新:我通过将HttpPostedFileBase
转换为Image
,然后将Image
转换为byte[]
来解决了该问题,但是我仍然有兴趣弄清楚为什么我必须执行这个中间步骤。
Image i = Image.FromStream(ImageData.InputStream, true, true);
byte[] imgData = imageToByteArray(thumb);
public byte[] imageToByteArray(Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
UPDATE#2:我认为我的代码问题可能是if (memoryStream == null)
块中的代码永远不会被调用。
答案 0 :(得分:6)
您可以使用BinaryReader
类将字符串读入字节数组:
byte[] imgData;
using (var reader = new BinaryReader(ImageData.InputStream))
{
imgData = reader.ReadBytes(ImageData.ContentLength);
}
答案 1 :(得分:2)
我有类似的代码,其中我将流直接读入byte [],如下所示:
var streamLength = ImageData.InputStream.Length;
var imageBytes = new byte[streamLength];
ImageData.InputStream.Read(imageBytes, 0, imageBytes.Length);
然后我将imageBytes作为varbinary(MAX)
存储到数据库中。似乎工作正常。
答案 2 :(得分:2)
JoeEnos建议,答案最终成为memoryStream == null
检查。 MemoryStream
在此检查正上方的行上实例化 - 因此它永远不应为null - 应该使用if (memoryStream.Length == 0)
进行检查。
答案 3 :(得分:1)
型号代码
public class AdminDetailsModel
{
public byte[] AdminImage { get; set; }
}
查看代码
@using (Html.BeginForm("Create", "AdminDetails", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="form-group">
@Html.LabelFor(model => model.AdminImage, new { @class = "control-label col-md-2" })
<div class="col-md-10">
<input type="file" name="ImageData" id="ImageData" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
您的控制器中的代码
public ActionResult Create(AdminDetailsModel viewmodel)
{
if (ModelState.IsValid)
{
HttpPostedFileBase file = Request.Files["ImageData"];
viewmodel.Image = ConvertToByte(file);
db.YourDbContextSet.Add(viewmodel);
db.SaveChanges();
}
}
public byte[] ConvertToByte(HttpPostedFileBase file)
{
byte[] imageByte = null;
BinaryReader rdr = new BinaryReader(file.InputStream);
imageByte = rdr.ReadBytes((int)file.ContentLength);
return imageByte;
}
希望这会有所帮助