2007년 08월 03일
C#으로 게시판 자동등록기
사진을 찍는 후배녀석이 사이트에 게시를 하는데 노가다(?)를 하고 있다고 쉽게 할 수 있는 방법이 없냐고 물어봤다. 그래서 제약사항을 들어보니, 제목 한개에 내용은 없고 첨부 이미지가 있다는 것이다. 제목도 같은 걸 30개나 올리는데 무지 짜증난다고 투덜투덜.
그래서, 살짝 만들어 주기로 했다. 예전에 asp.net 프로젝트할 때 C#을 해봤던 경험으로 일단 덤벼들었다. 일단 결과물 부터 공개.

1. Browse를 클릭하여 폴더를 선택
2. 선택한 폴더내 JPG목록 중 게시하고 하는 이미지를 선택하고 '->'버튼 클릭
3. 제목을 넣고 전송버튼 클릭
4. 결과확인

구글링을 통한 짜깁기의 결정체다.
일단, 썸네일뷰는 아래 URL참고(너무 그대로 배꼈나? ㅡㅡ)
http://www.codeproject.com/useritems/C__based_thumbnail_viewer.asp
ListView를 sub class 하였는데, 이것저것 고쳐서 오른쪽 view에도 적용했다.
썸네일 생성속도가 좀 늦길래 4개씩 생성하도록 변경
다음, 업로드 참고 URL
http://www.codeproject.com/csharp/UploadFileEx.asp
post로 보내긴 하는것 같은데 아무래도 이상해서 수정
마지막으로 로그인 부분은 방법만 소개한다.(혹시 모를 악용의 여지가 있기 때문에...)
1. 일단 해당 사이트로 System.Net.WebRequest를 이용하여 쿠키를 받아온다.
2. 같은 방법으로 System.Net.WebRequest를 이용하여 로그인 한다. 이때 받아온 쿠키를 같이 전달한다.
3. 게시작성 URL로 위 UploadFileEx를 양껏(?) 호출한다.
간만에 C#코딩 해보니 새롭다. (물론 구글링이지만..)
덧1) 올해 초부터 코딩해본 언어를 새어보니 대략 5개 정도 되는것 같습니다. (자랑질 같지만...네, 맞습니다. ㅡ.ㅡ;; 하지만, 얇게알고 있다는 반증 ㅡ,.ㅡ)
PHP, JAVA, PERL, VBScript(asp), C#
덧2) 다음번엔 crop & resize를 붙여줄까 생각중입니다. (생각만.... 기차나... 기차나...) 참고 URL은 아래
http://www.codeproject.com/csharp/imageresize.asp
덧3) 태그에 특수문자가 등록이 안되서 'C#'을 'Csharp'으로, 'multipart/form-data'는 'multipart'로만 넣음. 되게 해주면 안되나요? ㅡㅡ;
덧4) 근데 여기 올린 글만 보고, 따라했다가 문제가 생겼다고 책임지라고 하면 절대로 책임 못져요. ㄷㄷㄷ
그래서, 살짝 만들어 주기로 했다. 예전에 asp.net 프로젝트할 때 C#을 해봤던 경험으로 일단 덤벼들었다. 일단 결과물 부터 공개.

1. Browse를 클릭하여 폴더를 선택
2. 선택한 폴더내 JPG목록 중 게시하고 하는 이미지를 선택하고 '->'버튼 클릭
3. 제목을 넣고 전송버튼 클릭
4. 결과확인

구글링을 통한 짜깁기의 결정체다.
일단, 썸네일뷰는 아래 URL참고(너무 그대로 배꼈나? ㅡㅡ)
http://www.codeproject.com/useritems/C__based_thumbnail_viewer.asp
ListView를 sub class 하였는데, 이것저것 고쳐서 오른쪽 view에도 적용했다.
썸네일 생성속도가 좀 늦길래 4개씩 생성하도록 변경
다음, 업로드 참고 URL
http://www.codeproject.com/csharp/UploadFileEx.asp
post로 보내긴 하는것 같은데 아무래도 이상해서 수정
public string UploadFileEx(string uploadfile,
string url,
string fileFormName,
string contenttype,
NameValueCollection querystring,
CookieContainer cookies)
{
if ((fileFormName == null) ||
(fileFormName.Length == 0))
{
fileFormName = "file";
}
if ((contenttype == null) ||
(contenttype.Length == 0))
{
contenttype = "application/octet-stream";
}
Uri uri = new Uri(url);
string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
webrequest.CookieContainer = cookies;
webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
webrequest.Method = "POST";
// Build up the post message header
StringBuilder sb = new StringBuilder();
if (querystring != null)
{
foreach (string key in querystring.Keys)
{
//postdata += key + "=" + querystring.Get(key) + "&";
sb.Append("--");
sb.Append(boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"");
sb.Append(key);
sb.Append("\r\n");
sb.Append("\r\n");
sb.Append(querystring.Get(key));
sb.Append("\r\n");
}
}
sb.Append("--");
sb.Append(boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"");
sb.Append(fileFormName);
sb.Append("\"; filename=\"");
sb.Append(Path.GetFileName(uploadfile));
sb.Append("\"");
sb.Append("\r\n");
sb.Append("Content-Type: ");
sb.Append(contenttype);
sb.Append("\r\n");
sb.Append("\r\n");
string postHeader = sb.ToString();
//byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);
byte[] postHeaderBytes = Encoding.GetEncoding("euc-kr").GetBytes(postHeader);
// Build the trailing boundary string as a byte array
// ensuring the boundary appears on a line by itself
byte[] boundaryBytes =
Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
FileStream fileStream = new FileStream(uploadfile,
FileMode.Open, FileAccess.Read);
long length = postHeaderBytes.Length + fileStream.Length +
boundaryBytes.Length;
webrequest.ContentLength = length;
Stream requestStream = webrequest.GetRequestStream();
// Write out our post header
requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
// Write out the file contents
byte[] buffer = new Byte[checked((uint)Math.Min(4096,
(int)fileStream.Length))];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
requestStream.Write(buffer, 0, bytesRead);
// Write out the trailing boundary
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
WebResponse responce = webrequest.GetResponse();
Stream s = responce.GetResponseStream();
StreamReader sr = new StreamReader(s);
return sr.ReadToEnd();
}
마지막으로 로그인 부분은 방법만 소개한다.(혹시 모를 악용의 여지가 있기 때문에...)
1. 일단 해당 사이트로 System.Net.WebRequest를 이용하여 쿠키를 받아온다.
2. 같은 방법으로 System.Net.WebRequest를 이용하여 로그인 한다. 이때 받아온 쿠키를 같이 전달한다.
3. 게시작성 URL로 위 UploadFileEx를 양껏(?) 호출한다.
간만에 C#코딩 해보니 새롭다. (물론 구글링이지만..)
덧1) 올해 초부터 코딩해본 언어를 새어보니 대략 5개 정도 되는것 같습니다. (자랑질 같지만...네, 맞습니다. ㅡ.ㅡ;; 하지만, 얇게알고 있다는 반증 ㅡ,.ㅡ)
PHP, JAVA, PERL, VBScript(asp), C#
덧2) 다음번엔 crop & resize를 붙여줄까 생각중입니다. (생각만.... 기차나... 기차나...) 참고 URL은 아래
http://www.codeproject.com/csharp/imageresize.asp
덧3) 태그에 특수문자가 등록이 안되서 'C#'을 'Csharp'으로, 'multipart/form-data'는 'multipart'로만 넣음. 되게 해주면 안되나요? ㅡㅡ;
덧4) 근데 여기 올린 글만 보고, 따라했다가 문제가 생겼다고 책임지라고 하면 절대로 책임 못져요. ㄷㄷㄷ
# by | 2007/08/03 23:24 | 개발 | 트랙백 | 덧글(4)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
텍스트화일을 읽어들였는데요
라인이 20만줄인데
예를 들어 10번째줄부터 20번째줄까지만 가져오려한다면
어떻게 해야할까요??
이게 계속 10씩 증가하는데 다 읽어들여서 해당위치값을 불러들이는
반복작업을 시키자니 뒤로갈수록 화일다 읽고 해당위치 가져오고하면
꽁수코딩이 답이 아니더라고요
고수님의 한줄 답변을 기다립니다
mmap으로 구글링 해보시면 좋을것 같습니다.
도움이 못되드려 죄송 ㅡㅡ;
c# 초보입니다 질문한가지 드리겠습니다 제가 임의의사이트에 접속하려고 아래와 같이 코딩하였습니다
http 방식의 접속인데요...
timer_i = 0;
timer1.Interval = 100;
timer1.Start();
HttpWebRequest s_log = (HttpWebRequest)WebRequest.Create(http://www.www.com); //으로접속하여
.
......기타등등...
......기타등등...
......하고
.
url_connect.Write(sendBuffes_login, 0, sendBuffes_login.Length); //이렇게 값을 던졌습니다
timer1.Stop();
.
.
.
private void timer1_Tick(object sender, EventArgs e)
{
txt_time_out.Text = timer_i.ToString();
timer_i++;
}
이렇게요....
그런데 플이 응답이 없고 먹통이 되길래 웹브라우져로 열어보니 역시나 한참있다가 페이지없음이
뜨더라 이거죠 그래서
응답이 없으면 타이머로 5초간시간재서 응답이 없으면 중단을 하려고 타이머코드를 추가했는데요
저게 폼자체가 먹통이 되어서 시간이 올라가는게 보이질 않습니다 ㅠ.ㅠ
타이머도 작동안하고요 먹통이 되어서요
5초지나도 timer1.Stop(); 까지 진행이 안되면 응답없는 사이트로 간주하여 작업을 중단해야하는데
말이죠 1분까이 먹통됬다 오류페이지 띄워주십니다ㅠ.ㅠ
답변을 기다립니다...
아참 그리고 현재작업이 먹통이되어 중단하려면 this.Dispose(); 이 명령어를 호출하게 하면되나요??
현재작업중단 처리도 제가 헤메는 부분입니다
어떤님께 여쭤봤더니...
->보통 쓰레드를 사용해서 해결하는데...
->파일 읽어 오는 부분을 별도의 쓰레드로 만들어서
->시작하면 다른 이벤트 받는데 지장없습니다.
음....쓰레드처리하라시는데 제가 초보라...
약간의 코드주석을 좀 달아서 답변주시면 대단히 감사하겠습니다
저도 잘 몰라서리... ^^;;