0

私は、ユーザーが写真をページにドラッグしてそれらの写真をアップロードできるようにするために、以下を使用しようとしています。

http://alex-tech-adventures.com/development/x-html--css--javascript/97-drag-and-drop-upload-using-html5-with-firefox.html

今、私はこれでモデルバインディングを機能させようとしていますが、これまでのところ、何も組み込まれていないので、これを機能させる方法を知っている人はいますか?

バックアップとして、InputStreamを使用して、送信されたデータを文字列として引き出し、オブジェクトにsdserializeすることを知っています...

var stream = this.Request.InputStream;
var result = "";
using (var reader = new StreamReader(stream))
{
    result = reader.ReadToEnd();
}
var serializer = new JavaScriptSerializer(); 
var typedObjectResult = serializer.Deserialize<UploadInput>(result);

しかし、私はメッセージの画像部分をバイト配列に変換し、それをファイルに保存しています。画像の文字列の内容は次のようになります。

data:image/jpeg;base64,/9j/4RjhRXhpZg........3Xuve9de6//9k=

これを画像として保存するにはどうすればよいですか?バイト配列をファイルに書き込めるだけでいいのでしょうか?

しかし、私の主な関心事は、モデルのバインディングを正しくすることです。

乾杯

4

1 に答える 1

5

OK、これを実行に移しましょう。いつものように、ビューモデルを定義することから始めます。

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準拠のブラウザを起動して、楽しんでください。

于 2011-02-13T20:56:16.920 に答える