CKEditor .net core 이미지 드래그 앤 드
-
게시물 수정 , 삭제는 로그인 필요
CKEditor를 .net core 2.1에 적용을 했는데, 이미지를 드래앤 드롭으로 삽입하니까 다음과 같은 알림이 뜹니다. 이 알림을 없애고 싶은데 방법 좀 가르쳐 주세요
<View>
CKEDITOR.replace('editor1', {
filebrowserImageUploadUrl: '/Drafts/UploadImage?responseType=json',
filebrowserUploadMethod: 'form',
removeDialogTabs : 'image:Upload',
filebrowserUploadHeaders: {
'X-CSRF-TOKEN': 'your-csrf-token', // CSRF 토큰 추가 (선택 사항)
},
on: {
fileUploadResponse: function (evt) {
// 이미지 업로드 후 처리
var xhr = evt.data.fileLoader.xhr;
var response = JSON.parse(xhr.responseText);
if (response && response.success) {
var imageUrl = response.imagePath;
CKEDITOR.instances['editor1'].insertHtml('<img src="' + imageUrl + '" alt="Your Alt Text">');
} else {
alert("이미지 업로드에 실패했습니다.");
console.error(response.error);
}
},
contentDom: function (event) {
var editor = event.editor;
// 내용이 변경될 때마다 호출되는 이벤트
editor.document.getBody().on('keydown', function (event) {
// Backspace 키가 눌렸을 때
if (event.data.getKey() === 8 || event.data.getKey() === 46) {
handleBackspaceKey(editor);
}
});
}
}
});
function handleBackspaceKey(editor) {
var selection = editor.getSelection();
var range = selection.getRanges()[0];
// Delete 또는 Backspace 키를 눌렀을 때 현재 커서 위치에 이미지가 있는지 확인
range.shrink(CKEDITOR.SHRINK_TEXT);
var startNode = range.startContainer.getChild(range.startOffset - 1);
var endNode = range.startContainer.getChild(range.endOffset);
// 삭제된 노드가 이미지인 경우
if ((startNode && startNode.getName() === 'img') || (endNode && endNode.getName() === 'img')) {
// 삭제된 노드를 찾아서 이미지를 삭제
var node = startNode || endNode;
var imageUrl = node.getAttribute('src');
// 서버에 이미지 삭제 요청 보내는 함수
deleteImageOnServer(editor, imageUrl);
}
}
function deleteImageOnServer(editor, imageUrl) {
$.ajax({
type: 'POST',
url: '/Drafts/DeleteImage',
data: { imageUrl: imageUrl },
success: function (response) {
if (response.success) {
// 서버에서 이미지 삭제가 성공하면 에디터에서도 이미지 제거
var imageElement = editor.document.findOne('img[src="' + imageUrl + '"]');
if (imageElement) {
imageElement.remove();
}
} else {
alert('이미지 삭제 실패.');
}
},
error: function () {
alert('서버 오류: 이미지 삭제 실패.');
}
});
}
<Controller>
[HttpPost]
public ActionResult UploadImage(IFormFile upload)
{
try
{
// 이미지 확장자 및 MIME 타입 확인
string[] supportedExtensions = { ".jpg", ".jpeg", ".png", ".gif" };
string fileExtension = Path.GetExtension(upload.FileName).ToLower();
if (!supportedExtensions.Contains(fileExtension) || !upload.ContentType.StartsWith("image/"))
{
return Json(new { success = false, message = "지원되지 않는 이미지 형식입니다." });
}
string path = Path.Combine("uploads", DateTime.Now.ToString("yyyy-MM-dd"));
string uploadPath = Path.Combine(_hostingEnvironment.WebRootPath, "uploads", DateTime.Now.ToString("yyyy-MM-dd"));
DirectoryInfo di = new DirectoryInfo(uploadPath);
if (di.Exists == false)
{
di.Create();
}
string uniqueFileName = Guid.NewGuid().ToString() + fileExtension;
string filePath = Path.Combine(uploadPath, uniqueFileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
upload.CopyTo(stream);
}
// 성공적으로 업로드된 경우 클라이언트에 이미지 경로 반환
string imageUrl = Path.Combine(path, uniqueFileName);
imageUrl = imageUrl.Replace('\\', '/');
return Json(new { success = true, imagePath = "/"+imageUrl });
}
catch (Exception ex)
{
return Json(new { success = false, message = ex.Message });
}
}
[HttpPost]
public IActionResult DeleteImage(string imageUrl)
{
try
{
// 이미지 경로를 기반으로 실제 경로 구성
string physicalPath = Path.Combine(_hostingEnvironment.WebRootPath, imageUrl.TrimStart('/'));
// 이미지 파일 존재 여부 확인 후 삭제
if (System.IO.File.Exists(physicalPath))
{
System.IO.File.Delete(physicalPath);
return Json(new { success = true });
}
else
{
return Json(new { success = false, message = "이미지를 찾을 수 없습니다." });
}
}
catch (Exception ex)
{
return Json(new { success = false, message = ex.Message });
}
}
CKEditor를 .net core 2.1에 적용을 했는데, 이미지를 드래앤 드롭으로 삽입하니까 다음과 같은 알림이 뜹니다. 이 알림을 없애고 싶은데 방법 좀 가르쳐 주세요
<View>
CKEDITOR.replace('editor1', {
filebrowserImageUploadUrl: '/Drafts/UploadImage?responseType=json',
filebrowserUploadMethod: 'form',
removeDialogTabs : 'image:Upload',
filebrowserUploadHeaders: {
'X-CSRF-TOKEN': 'your-csrf-token', // CSRF 토큰 추가 (선택 사항)
},
on: {
fileUploadResponse: function (evt) {
// 이미지 업로드 후 처리
var xhr = evt.data.fileLoader.xhr;
var response = JSON.parse(xhr.responseText);
if (response && response.success) {
var imageUrl = response.imagePath;
CKEDITOR.instances['editor1'].insertHtml('<img src="' + imageUrl + '" alt="Your Alt Text">');
} else {
alert("이미지 업로드에 실패했습니다.");
console.error(response.error);
}
},
contentDom: function (event) {
var editor = event.editor;
// 내용이 변경될 때마다 호출되는 이벤트
editor.document.getBody().on('keydown', function (event) {
// Backspace 키가 눌렸을 때
if (event.data.getKey() === 8 || event.data.getKey() === 46) {
handleBackspaceKey(editor);
}
});
}
}
});
function handleBackspaceKey(editor) {
var selection = editor.getSelection();
var range = selection.getRanges()[0];
// Delete 또는 Backspace 키를 눌렀을 때 현재 커서 위치에 이미지가 있는지 확인
range.shrink(CKEDITOR.SHRINK_TEXT);
var startNode = range.startContainer.getChild(range.startOffset - 1);
var endNode = range.startContainer.getChild(range.endOffset);
// 삭제된 노드가 이미지인 경우
if ((startNode && startNode.getName() === 'img') || (endNode && endNode.getName() === 'img')) {
// 삭제된 노드를 찾아서 이미지를 삭제
var node = startNode || endNode;
var imageUrl = node.getAttribute('src');
// 서버에 이미지 삭제 요청 보내는 함수
deleteImageOnServer(editor, imageUrl);
}
}
function deleteImageOnServer(editor, imageUrl) {
$.ajax({
type: 'POST',
url: '/Drafts/DeleteImage',
data: { imageUrl: imageUrl },
success: function (response) {
if (response.success) {
// 서버에서 이미지 삭제가 성공하면 에디터에서도 이미지 제거
var imageElement = editor.document.findOne('img[src="' + imageUrl + '"]');
if (imageElement) {
imageElement.remove();
}
} else {
alert('이미지 삭제 실패.');
}
},
error: function () {
alert('서버 오류: 이미지 삭제 실패.');
}
});
}
<Controller>
[HttpPost]
public ActionResult UploadImage(IFormFile upload)
{
try
{
// 이미지 확장자 및 MIME 타입 확인
string[] supportedExtensions = { ".jpg", ".jpeg", ".png", ".gif" };
string fileExtension = Path.GetExtension(upload.FileName).ToLower();
if (!supportedExtensions.Contains(fileExtension) || !upload.ContentType.StartsWith("image/"))
{
return Json(new { success = false, message = "지원되지 않는 이미지 형식입니다." });
}
string path = Path.Combine("uploads", DateTime.Now.ToString("yyyy-MM-dd"));
string uploadPath = Path.Combine(_hostingEnvironment.WebRootPath, "uploads", DateTime.Now.ToString("yyyy-MM-dd"));
DirectoryInfo di = new DirectoryInfo(uploadPath);
if (di.Exists == false)
{
di.Create();
}
string uniqueFileName = Guid.NewGuid().ToString() + fileExtension;
string filePath = Path.Combine(uploadPath, uniqueFileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
upload.CopyTo(stream);
}
// 성공적으로 업로드된 경우 클라이언트에 이미지 경로 반환
string imageUrl = Path.Combine(path, uniqueFileName);
imageUrl = imageUrl.Replace('\\', '/');
return Json(new { success = true, imagePath = "/"+imageUrl });
}
catch (Exception ex)
{
return Json(new { success = false, message = ex.Message });
}
}
[HttpPost]
public IActionResult DeleteImage(string imageUrl)
{
try
{
// 이미지 경로를 기반으로 실제 경로 구성
string physicalPath = Path.Combine(_hostingEnvironment.WebRootPath, imageUrl.TrimStart('/'));
// 이미지 파일 존재 여부 확인 후 삭제
if (System.IO.File.Exists(physicalPath))
{
System.IO.File.Delete(physicalPath);
return Json(new { success = true });
}
else
{
return Json(new { success = false, message = "이미지를 찾을 수 없습니다." });
}
}
catch (Exception ex)
{
return Json(new { success = false, message = ex.Message });
}
}
#ckeditor .net #ckeditor.net.dll free download #ckeditor .net mvc #ckeditor.net.dll download #ckeditor.net nuget #ckeditor net core mvc #ckeditor.net reference #ckeditor .net core #ckeditor in asp.net c# #ckeditor 5 asp.net mvc