私は自分のフォームに画像をアップロードしています:
@using (Html.BeginForm("Create", "Application", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Application Under Testing</legend>
<div class="editor-label">
Image
</div>
<div class="editor-field">
@if (Model.AppDetails.Image == null)
{
@:None
} else {
<img width="400" src="@Url.Action("GetImage", "Application", new { Model.AppDetails.ID })" />
}
<div>Upload new image: <input type="file" name="Image" /></div>
</div>
</fieldset>
}
これにより送信され、次を使用してデータベースに保存されます。
[HttpPost]
public ActionResult Create(ApplicationViewModel vm, HttpPostedFileBase image)
{
if (ModelState.IsValid)
{
if (image != null)
{
vm.AppDetails.ImageMimeType = image.ContentType;
vm.AppDetails.Image = new byte[image.ContentLength];
image.InputStream.Read(vm.AppDetails.Image, 0, image.ContentLength);
}
_repository.SaveEntity<AUT>(vm.AppDetails);
return RedirectToAction("Index");
}
return View(vm);
}
これで、データベースから画像を取得して表示するアクションができました。
public FileContentResult GetImage(Guid appID)
{
var app = _repository.AUTs.FirstOrDefault(x => x.ID.Equals(appID));
if (app == null)
{
return null;
}
return File(app.Image, app.ImageMimeType);
}
私の見解では、画像を表示するための次のコードがあります。
<td>
@if (item.Image == null)
{
@:None
} else {
<img width="100" src="@Url.Action("GetImage", "Application", new { item.ID })" />
}
</td>
Web ページの出力は次のとおりです。
<img width="100" src="/Validation/Application/GetImage/bd3fdb5b-8d73-48e2-a04e-1a49a73729be">
これは画像を表示していません。編集: Chrome で要素を実際に調べたところ、2 つのエラー (画像ごとに 1 つ) があります: エラー 500 内部サーバー エラー。getimage の URL が表示されますが、完全修飾 URL を使用する価値はありますか? か何か?
私の推測では、正しいデータをデータベースに保存していないか、データを画像形式に正しく読み取っていません。またはどこかで私のコードが間違っています。
何かご意見は?
- - 編集 - -
これで単体テストを実行して、画像を取得できるかどうかを確認しました。テストは合格しました。
したがって、サーバー側は正常に動作しているように見えるため、クライアント側でのレンダリングと関係があるに違いありません。Chrome はエラーを次のように表示します: 500 Internal Server Error.