반응형

파일 다운로드 로직을 만들었을때 Return File을 사용하여 브라우저에서 다운로드를 받을 수 있게 만들었었다.

이번 프로젝트에서도 파일 다운로드 로직이 있었고 기존대로 사용하였는데 문제가 발생 하였다.

이미지로 데이터 화 시켜서 올렸을 때 '아이폰' 에서는 Content Type에 따라서 확장자가 변경되어 저장이 되고 있었다.

 

실제로 사용하던 Return 형태

return File(파일명, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 다운로드 받을 때 파일명);

 

Content Type을 보면 알겠지만 예전에 엑셀 파일을 다운로드 받을 때 사용했었던 Excel Content Type 이였는데

브라우저에서 받을 때 혹은 안드로이드에서 받을 때는 문제가 되지 않았다.

 

다만 아이폰에서 받았을 때 이미지 파일임에도 불구하고 뒤에 .xlsx가 붙어서 다운로드가 되었다.

이미지 형태로 여러가지 받아야 하는 상황이여서 파일이 유동적으로 변하기 때문에 골치 아팠다.

 

File 매개변수는 무조건 파일명과 Content Type을 입력해야했기 떄문에 자체적으로 판단하여 파일이 다운로드 됐으면 했는데 아래와 같은 방법으로 해결하였다.

return File(파일명, "application/octet-stream", 다운로드 시 파일명);

 

현재 파일 다운로드 로직 상 bmp , jpg , jpeg , jpe , jfif , tif , tiff , png 해당 확장자만 저장 되게끔 사용되고 있어서 

해당 확장자들은 정상적으로 다운로드 되는 것 까지 확인 하였다.

반응형

카카오톡에서 URL을 입력 시 해당 사이트에 데이터들이 나오는데 그것들이 제대로 나오지 않는 경우가 있습니다.

 

아래의 데이터를 Head 태그 안에 넣어서 수정하고 카카오톡 사이트에 들어가서 캐시를 지워주면 바로 보실 수 있습니다.

<meta property="og:type" content="website" />
<meta property="og:title" content="타이틀" />
<meta property="og:image" content="사이트 시 이미지" />
<meta property="og:site_name" content="사이트 이름" />
<meta property="og:url" content="URL" />
<meta property="og:description" content="사이트 설명" />

 

카카오톡 캐시 지우는 사이트 링크 (로그인 필수)

https://developers.kakao.com/tool/clear/og

 

카카오계정 로그인

여기를 눌러 링크를 확인하세요.

accounts.kakao.com

 

 

반응형

오랜만에 작성하는 블로그 글입니다.

 

메일에서 pdf를 다운로드 받을 수 있게 A 태그를 사용하여 마크업을 만들고 

 

메일 내용에서 다운 받을 수 있게 하는 마크업을 만드려고 하였습니다.

 

하지만 pdf는 파일다운로드는 실패하였고 Viewer로만 나오게 하는 것만 성공 하였습니다.

 

해당 내용 관련하여 정리합니다.

 

 

결론 : 브라우저 정책 마다 다운로드 되기도 하고 안되기도 하고 한다.

정리 : https에서 http 사이트의 pdf 다운로드 하는게 목적

※브라우저※
IE : 가능
엣지 : 경고창으로 띄어주고 사용자가 직접 다운로드 받게 하였음.
크롬 : 정책상 불가능 (20년도 9월쯤 http에 pdf 파일을 다운로드 받는 것을 차단 시켜버림)
        ※ 참고 - https://blog.chromium.org/2020/02/protecting-users-from-insecure.html
파이어 폭스 : 가능

직접 다운로드는 불가능 하고 파일 다이렉트 경로를 a href에 지정하여 브라우저의 pdf 뷰어로 열게끔 하는것은 모든 브라우저가 가능하여 그렇게 작업 하였음.


반응형

안녕하세요

오랜만에 글을 적으러 왔습니다.

 

프로젝트 로컬에 이미지가 있는지 여부를 확인 해야되는 상황이 있었는데 아래와 같은 코드로 

확인 후 Boolean 처리로 할 수 있는걸 알게 되어서 정리 합니다.

 

이미지뿐만 아니라 다른 파일들도 가능 할 것으로 보입니다.

//이미지 여부 체크
function fnImgChk(url) {

    var vResult;

    $.ajax({
        url: url,
        type: 'HEAD',
        async: false,
        success: function () {
            vResult = true;
        },
        error: function () {
            vResult = false;
        }
    });

    return vResult;
}
반응형

오랜만에 C#으로 찾아왔습니다.

 

Linq 라는 것은 데이터와 데이터를 비교하여 필요한 데이터를 다시 새롭게 재 구성하기 위해서 쓰는 것이라고 요번에 습득 하였습니다.

 

이번 로직을 만들면서 2가지를 다시 배웠습니다.

 

1. LinQ는 데이터와 데이터를 재 구성하여 필요한 데이터만 찾을 수 있다.

2. DataTable에도 타입이 존재한다.

 

2번 같은 경우는 select를 다시 할 때 무척이나 애 먹었습니다..

실제 오라클 테이블에 Number로 정의가 되어있어서 데이터테이블로 데이터를 가져왔을때 컬럼 타입이 Int32로 구성되어있어서 그 부분을 확인 하지 못해 엄청난 삽질을 하였습니다.

 

아래는 제가 Linq를 사용하여 데이터를 구성한 로직입니다.

 

감사합니다.

 

//APIdt , Resultdt는 데이터 테이블 형식 입니다. 
var query = (from APIData in APIdt.AsEnumerable()
			 join dbData in Resultdt.AsEnumerable()
			 on new
			 {
				 //비교할 이름을 같게 해주어야 합니다. TEST1 , TEST2
				 TEST1 = APIData.Field<string>("TEST1"),
				 TEST2 = APIData.Field<string>("TEST2")
			 }
			 equals new
			 {
				//비교할 이름을 같게 해주어야 합니다. TEST1 , TEST2
				 TEST1 = dbData.Field<string>("TEST1"),
				 TEST2 = dbData.Field<string>("TEST2")
			 }
			 select new
			 {
				 //Field 형식이 굉장히 중요하기 떄문에 데이터테이블의 타입이 어떤것인지 꼭 확인이 필요합니다. 
				 //Test1 , Test2 , Test3 , Test4는 변수입니다. 
				 Test1 = APIData.Field<string>("REQ_SVC"),
				 Test2 = dbData.Field<int>("FCL_CNT"),
				 Test3 = dbData.Field<int>("LCL_CNT"),
				 Test4 = dbData.Field<int>("CONSOL_CNT")
			 });                    

//데이터테이블을 생성 해 줍니다.
DataTable Final_DT = new DataTable();
Final_DT.Columns.Add("Test1");
Final_DT.Columns.Add("Test2");
Final_DT.Columns.Add("Test3");
Final_DT.Columns.Add("Test4");

//구성된 데이터를 다시 데이터테이블로 만들어줍니다. 
foreach (var item in query)
{
	DataRow Final_Dr = Final_DT.NewRow();
	Final_Dr["Test1"] = item.Test1;
	Final_Dr["Test2"] = item.Test2;
	Final_Dr["Test3"] = item.Test3;
	Final_Dr["Test4"] = item.Test4;
	Final_DT.Rows.Add(Final_Dr);
}

완성된 데이터 테이블
Final_DT

 

반응형

달력 넘기듯 이전 다음을 클릭 시 년/월이 자동으로 세팅 되게 한 함수 입니다.

 

기본적으로 '월' 만 체크하여 년도 계산도 같이 합니다.

 

////////////////////전역 변수//////////////////////////
var _vSelectDate = new Date();

//년월 이전 다음 세팅하기 vLR은 L은 이전달 / R은 다음달 입니다.
function fnSetYearMonth(vLR) {
    try {
    	//cal_date는 YYYY.MM 으로 세팅 되어있습니다. 그렇기 때문에 마지막 2자리(월)만 짤라서 씁니다.
        var vValue = Number($("#cal_date").text().slice(-2, $("#cal_date").text().length)-1);

        if (vLR == "L") {
            if (vValue == 0) {
                _vSelectDate = new Date((_vSelectDate.getFullYear() - 1), 11, 1);
            } else {
                _vSelectDate = new Date(_vSelectDate.getFullYear(), (vValue-1), 1);
            }
        }
        else if (vLR == "R") {
            if (vValue == 12) {
                _vSelectDate = new Date((_vSelectDate.getFullYear() + 1), 0, 1);
            } else {
                _vSelectDate = new Date(_vSelectDate.getFullYear(), (vValue+1), 1);
            }
        }

        var weekYear = _vSelectDate.getFullYear();
        var weekMonth = _vSelectDate.getMonth()+1;

        var result = weekYear + "." + _pad(weekMonth, "2");
        return result;
    }
    catch (err) {
        console.log("[Error - _fnSetYearMonth]" + err.message);
    }
}

date는 -1을 해야되는데 문과다 보니까 머리가 잘 안돌아가네요..

 

숫자 계산 힘들다 ㅠ ㅠ 

반응형

안녕하세요

 

또 한달만에 작성하는 블로그 입니다.

 

구글 API를 사용하여 Marker를 여러개 세팅하고 클릭하면 해당 ID를 가져와서 해당 마커의 대한 데이터를 가져오려고  

 

만든 소스 입니다.

 

다른 분들도 필요할지 모르겠지만..

map = new google.maps.Map(document.getElementById('google_map'), {        
        center: {
            lat: 37.551073,
            lng: 126.987893
        },
        zoom: 10,        
        //zoomControl: false,  줌 컨트롤
        streetViewControl: false, //로드뷰 아이콘 on/off        
        mapTypeControl : false //맵 타입 on/off (지도 , 위성)
    });

    //Marker 위치 세팅 (label , 경도 , 위도 , 아이디)
    var locations = [
        ['서울역', 37.5546788, 126.9706069,'idtest1'],
        ['서울특별시청', 37.5668260, 126.9786567, 'idtest2'],
        ['을지로입구역', 37.5660373, 126.9821930, 'idtest3'],
        ['덕수궁', 37.5655638, 126.974894, 'idtest4'],
    ];   

    //var infowindow = new google.maps.InfoWindow();
    var marker, i;

	//위치를 세팅 시켜줍니다.
    for (i = 0; i < locations.length; i++) {
        marker = new google.maps.Marker({
            position: new google.maps.LatLng(locations[i][1], locations[i][2]),
            map: map,
            id: locations[i][3]
        });

		//Marker를 찍었을 때 클릭 이벤트
        google.maps.event.addListener(marker, 'click', (function (marker, i) {
            return function () {
                alert(this.id); //아이디 가져오기

                ////중심 위치를 클릭된 마커의 위치로 변경
                //map.setCenter(this.getPosition());
              
                ////마커 클릭 시의 줌 변화
                //map.setZoom(14);

                //마커 클릭 시 label 및 데이터 보여주기
                //infowindow.setContent(locations[i][0]);
                //infowindow.open(map, marker);
            }
        })(marker, i));
    }

 

해당 건은 여러개의 블로그를 보고 만들었습니다.

 

감사합니다 :D

 

반응형

오랜만에 인사드립니다.

 

새롭게 코딩을 요즘 잘 안하다 보니 기존에 썼던거만 쓰네요..

//4자리 시간 확인하여 AM/PM 구하기
function _fnSetAMPM(vTime) {
    var vValue = vTime.substr("0", "2");
    var vAMPM = vValue >= 12 ? "PM" : "AM";

    return vAMPM;    
}

 

 

 

+ Recent posts