ОК, давайте приведем это в действие. Как всегда, начнем с определения модели вида:
public class ImageData
{
public string Description { get; set; }
public string Filename { get; set; }
public string Image { get; set; }
}
затем контроллер:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(IEnumerable<ImageData> images)
{
foreach (var item in images ?? Enumerable.Empty<ImageData>())
{
var tokens = item.Image.Split(',');
if (tokens.Length > 1)
{
var buffer = Convert.FromBase64String(tokens[1]);
var file = Path.Combine(HttpContext.Server.MapPath("~/"), item.Filename);
System.IO.File.WriteAllBytes(file, buffer);
}
}
return Json(new { Status = "OK" });
}
}
и, наконец, вид:
<div id="uploadArea" style="background-color: yellow; width: 170px; height: 50px;">
drop images here
</div>
@Html.ActionLink("Upload images", "index", null, new { id = "upload" })
<div id="imagesContainer" />
<script type="text/javascript">
$('#uploadArea').bind('dragover', function (event) {
event.preventDefault();
}).bind('drop', function (event) {
event.preventDefault();
var files = event.originalEvent.dataTransfer.files;
$.each(files, function (index, file) {
var img = $('<img/>')
.addClass('droppedImage')
.attr('data-filename', file.name);
$('#imagesContainer').append(img);
img.file = file;
var reader = new FileReader();
reader.onloadend = function () {
img.attr('src', reader.result);
}
reader.readAsDataURL(file);
});
});
$('#upload').click(function () {
var imagesJson = $('.droppedImage').map(function () {
var $this = $(this);
return {
image: $this.attr('src'),
filename: $this.attr('data-filename')
};
}).toArray();
$.ajax({
url: this.href,
type: 'POST',
data: JSON.stringify({ images: imagesJson }),
contentType: 'application/json',
success: function (result) {
alert('success');
}
});
return false;
});
</script>
Теперь запустите браузер, совместимый с HTML 5, и получайте удовольствие