javascript 如何使用croppie js裁剪图像并在asp.net mvc中上传

pgky5nke  于 5个月前  发布在  Java
关注(0)|答案(2)|浏览(48)

嗨,我想裁剪图像并上传到服务器上。
我正在使用croppie js插件,并使用**get()**方法通过使用WebImage类在服务器上获取点。

Asp.net MVC代码

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ImageCrop(FormCollection fc)
    {
                WebImage data = WebImage.GetImageFromRequest();
                if (data != null)
                {
                    int x1, y1, x2, y2;
                    x1 = int.Parse(fc["x1"].ToString());
                    y1 = int.Parse(fc["y1"].ToString());
                    x2 = int.Parse(fc["x2"].ToString());
                    y2 = int.Parse(fc["y2"].ToString());
                    var fileName = Path.GetFileName(data.FileName);
                    fileName = Lawyer_id2 + ".jpeg";
                    var big = Server.MapPath("~/contents/ProfilePictures/big/" + fileName);
                    data.Crop(y1, x1, x2, y2);
                    data.Save(big);

                }

      }

字符串

Js代码

$uploadCrop = $('#upload-demo').croppie({
    viewport: {
        width: 200,
        height: 200,
        type: 'square'
    },
    boundary: {
        width: 300,
        height: 300
    },
    showZoomer: false,
    mouseWheelZoom: false
});
readFile(fl);
$(".closeModal").on("click", function () {
    $uploadCrop.croppie('result', {
        type: 'canvas',
        size: 'viewport'
    }).then(function (resp) {
        $('.upload-msg').css('display', '');
        popupResult({
            src: resp
        });

    });
    var arr = $uploadCrop.croppie('get').points;
    $("#x1").val(arr[0]);
    $("#y1").val(arr[1]);
    $("#x2").val(arr[2]);
    $("#y2").val(arr[3]);
});


我在隐藏的输入字段中获得所有点,然后将此点传递给webimge对象进行裁剪,但问题是裁剪后的图像不保持长宽比并错误地裁剪,浏览器侧裁剪是完美的,但当我将点传递到服务器端进行裁剪时,它不像浏览器端那样工作,我没有解决这个问题的线索。

eeq64g8w

eeq64g8w1#

裁剪已经在客户端发生,您应该只将结果发送到服务器端。不需要将裁剪点发送到服务器。
在html上定义SelectUpload按钮,并使用id="main-cropper"定义div

<div>
            <div>
                <div id="main-cropper"></div>
                <a class="button actionSelect">
                    <input type="file" id="select" value="Choose Image" accept="image/*">
                </a>
                <button class="actionUpload">Upload</button>
            </div>
        </div>

字符串
在JS代码中,将croppie对象附加到dive,定义视点边界,最后将请求发送到服务器以将结果存储为blob。在服务器端,假设将有一个Create控制器与GetImage操作等待请求。testFileName.png被分配为文件名,您可以根据您的场景修改它。

var basic = $('#main-cropper').croppie({
            viewport: { width: 200, height: 300 },
            boundary: { width: 300, height: 400 },
            showZoomer: false
        });

        function readFile(input) {
            if (input.files && input.files[0]) {
                var reader = new FileReader();

                reader.onload = function (e) {
                    $('#main-cropper').croppie('bind', {
                        url: e.target.result
                    });
                }

                reader.readAsDataURL(input.files[0]);
            }
        }

        $('.actionSelect input').on('change', function () { readFile(this); });
        $('.actionUpload').on('click', function() {
            basic.croppie('result','blob').then(function(blob) {
                var formData = new FormData();
                formData.append('filename', 'testFileName.png');
                formData.append('blob', blob);
                var MyAppUrlSettings = {
                    MyUsefulUrl: '@Url.Action("GetImage","Create")'
                }

                var request = new XMLHttpRequest();
                request.open('POST', MyAppUrlSettings.MyUsefulUrl);
                request.send(formData);
            });
        });


在服务器上,在Create控制器中:

[HttpPost]
    public ActionResult GetImage(string filename, HttpPostedFileBase blob)
    {
        var fullPath = "~/Images/" + filename;
        blob.SaveAs(Server.MapPath(fullPath));
        return Json("ok");
    }


生成uuid字符串,并将其设置为文件名并存储在数据库中也是有意义的。

hs1ihplo

hs1ihplo2#

我发布了一个解决方案,通过Croppie.js上传裁剪到服务器,
也许将来能帮到别人

js

// When you click for saving your crop
$("#upload-crop").on("click", function() {
  $uploadCrop.croppie('result', {
    type: 'base64',
    size: 'viewport',
    format: 'jpg',
  }).then(function (resp) {
    // Remove data:image/png;base64,
    var base64str = resp.substring(resp.indexOf(',') + 1);

    // If you want to show the crop result
    $('#img-result').attr('src', resp);
    // If you used a modal bootstrap
    $('#modal-crop').modal('hide');
    
    // Send to controller
    var formData = new FormData();
    formData.append('CropName', 'myCrop');
    formData.append('CropBase64', base64str);
    
    $.ajax({
      type: "POST",
      url: "/controller/UploadCrop",
      processData: false,
      contentType: false,
      data: formData,
      success: function (result) {
       // Success
      },
      error: function () {
       // Error
      }
    });
  });
});

字符串

c#

[HttpPost]
[ValidateInput(false)]
public ActionResult UploadCrop(string CropName, string CropBase64) { 
    var fullPath = System.IO.Path.Combine(Server.MapPath("~/Uploads"), CropName + ".jpg");
    System.IO.File.WriteAllBytes(fullPath, Convert.FromBase64String(CropBase64));
    return Content("uploaded");
}

相关问题