盡人事待天命

미디어협동조합 국민TV
function KTF(where,type,name,script,limit,num){
 var element='';

  element+="<input type='"+type+"' name='"+(name+x)+"' "+script+"><br>";

 document.getElementById(where).innerHTML = element;
}

 


Posted by 톰켓 Trackback 0 Comment 0
하는 방법은 알아서 ^^


jxl.jar파일입니다..

찾아보시면 다 잘나와 있죠
Posted by 톰켓 Trackback 0 Comment 0

JDK1.4 API에서 지원하는 이미지 디코딩,인코딩을 보려면 다음과 같은 문장을 실행하면 됩니다.

import javax.imageio.*;
import java.util.Arrays;

public class GetFormats {
        public static void main(String args[]) {
                String readFormats[] = ImageIO.getReaderMIMETypes();
                String writeFormats[] = ImageIO.getWriterMIMETypes();
                System.out.println("Readers: " + Arrays.asList(readFormats));
                System.out.println("Writers: " + Arrays.asList(writeFormats));
        }
} 

기본적으로 png,jpeg,gif 형식의 파일을 읽을 수 있으며 png,jpeg형식으로 쓸 수 있다고 출력이 나옵니다. GIF형식은 라이센스를 걸었는지 PHP같은데서도 기본적으로 지원을 하지 않더라구요..
그럼으로 gif형식의 파일을 읽었다고 해도 다시 gif형식으로는 저장을 할 수 없습니다.

다음 예제는 1.gif 이미지 파일을 읽은 후 50x50 사이즈의 이미지로 변형 한 후 저장하는 소스입니다. BufferedImage객체만이 ImageIO에서 write를 할 수 있는데 getScaledInstance메소드를 수행하면 Image객체로 변형이 되 버립니다. 그래서 BufferedImage객체를 새로 만든 후 scaling된 이미지를 그려 준 후 저장하는 방식으로 하였습니다.
다음과 같은 방법으로 사이즈를 변경 할 경우 윈도우가 존재해야 한다는 전제가 있어야 합니다. 즉 linux콘솔 상에서 사용할 경우 에는 에러가 발생합니다.

import java.io.*;
import java.awt.image.*;
import java.awt.*;
import javax.imageio.*;

public class ImageSize{

        public static void main(String args[]){
                try{
                        BufferedImage i = ImageIO.read(new File("1.gif")); //변형하고자 하는 이미지
                        Image img = i.getScaledInstance(50,50,Image.SCALE_DEFAULT ); //사이즈 변경
   
                        BufferedImage oi = new BufferedImage(50,50,BufferedImage.TYPE_INT_RGB ); //저장할 이미지 객체 생성
                        Graphics g = oi.getGraphics();
                        g.drawImage(img,0,0,new Panel()); //스케일링된 이미지 그리기

                        ImageIO.write(oi,"jpg",new File("2.jpg")); //새로운 이미지로 저장,jpg형식
                }catch(Exception e){
                        System.out.println(e);
                }
        }
}

자바에서 이미지 스케일링은 Image객체의 getScaledInstance 메소드를 이용하면 됩니다. (윈도우가 지원하는 경우)

하지만 윈도우 환경이 아닐 경우에는 다음과 같은 에러가 발생 하죠...

Exception in thread "main" java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
        at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
        at sun.awt.X11GraphicsEnvironment.(X11GraphicsEnvironment.java:126)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:130)
        --- 중략 --

갤러리를 만드는 도중 썸네일 이미지를 생성해야 할 일이 생겼는데 도저히 자바 API 갖구서는 해결이 되지 않더라구요.. 그렇다구 지금 잘 돌아가는 서버에 X를 띄우고 돌리기도 그렇고 해서 메소드를 만들었습니다. 약간은 허접 하지만 썸네일 이미지 정도로만 사용 하기에는 충분 합니다. 그럼 테스트용 소스 전문입니다. 주석은 별로 안 달았습니다.

import java.io.*;
import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*; 
import javax.imageio.*;

public class ImageProcessor{

        public static void saveJpeg(File file, BufferedImage image) throws Exception{
                saveJpeg(file, image, 0.7f);
        }

        public static void saveJpeg(String file, BufferedImage image) throws Exception{
                saveJpeg(file, image, 0.7f);
        }

        public static void saveJpeg(String file, BufferedImage image, float quality) throws Exception{
                saveJpeg(new File(file), image, quality);
        }

        public static void saveJpeg(File file, BufferedImage image, float quality) throws Exception{

                FileOutputStream fos = new FileOutputStream(file);

                JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fos);
                JPEGEncodeParam param = jpeg.getDefaultJPEGEncodeParam(image);

                param.setQuality(quality, true);
                jpeg.setJPEGEncodeParam(param);
                jpeg.encode(image);
                fos.close();
        }


        public static BufferedImage scaling(Image input, int new_width, int new_height) throws Exception{

                int org_width= input.getWidth(null);
                int org_height= input.getHeight(null);

                int[] org_pixels = new int[org_width * org_height];
                PixelGrabber pg = new PixelGrabber(input, 0, 0, org_width, org_height, org_pixels, 0, org_width);
                pg.grabPixels();

                int[] new_pixels = new int[new_width * new_height];

                scalingProcess(org_pixels, org_width, org_height, new_pixels, new_width, new_height);

                BufferedImage bi = new BufferedImage(new_width, new_height,BufferedImage.TYPE_INT_RGB);

                bi.setRGB(0, 0, new_width, new_height, new_pixels, 0, new_width);
                return bi;
        }

        private static void scalingProcess(int[] pixels, int width, int height, int[] new_pixels, int new_width, int new_height){
                int i,j;
                int value = 10000;
                int pos_h = value;
                int pos_w = value;

                int inc_h = (height*value)/new_height; //세로 증가량
                int inc_w = (width*value)/new_width; //가로 증가량

                int srcRow = 0; //소스의 세로줄의 위치
                int srcp = 0; //소스의 위치
                int dstp = 0; //타겟의 위치

                for(i=0; i<new_height; i++){ //세로로 한줄씩 

                        while(pos_h >= value){
                                srcp = srcRow*width;
                                srcRow++;
                                pos_h -= value;
                        }

                        dstp = i*new_width; //복사될 이미지의 줄 단위의 시작 점

                        //한줄 복사
                        int pixel = 0; //픽셀 값
                        pos_w = value;
                        for(j=0; j<new_width; j++){

                                while(pos_w >= value){
                                        pixel = pixels[srcp];
                                        srcp++;
                                        pos_w -= value;
                                }

                                new_pixels[dstp] = pixel;
                                dstp++;
                                pos_w += inc_w;
                        }

                        pos_h += inc_h;
                }
        }
}

사용 예제

import java.io.*;
import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*; 
import javax.imageio.*;

public class ImageScale{

        public static void main(String args[]){
                float quality = 0.7f;

                if(args.length < 2){
                        System.out.println("Usage>java ImageScale input.jpg output.jpg [quality]");
                        return;
                }

                if(args.length > 2){
                        try{
                                quality = Float.parseFloat(args[2]);
                                if(quality >= 1 && quality <=0) throw new Exception("Quality Range is 0 ~ 1");
                        }catch(Exception ex){
                                System.out.println("Quality Range is 0 ~ 1");
                                quality = 0.7f;
                        }
                }

                try{
                        Image image = ImageIO.read(new File(args[0]));
                        BufferedImage bi = ImageProcessor.scaling(image, 300, 300);
                        ImageProcessor.saveJpeg(args[1], bi, quality);
                }catch(Exception e){
                        System.out.println("Error" + e);
                }
        }

}
출처 : http://www.tvnuri.com/wikix/index.php?display=Java%20%2D%20%C0%CC%B9%CC%C1%F6%20%BB%E7%C0%CC%C1%EE%20%BA%AF%B0%E6%20%C8%C4%20%C0%FA%C0%E5%C7%CF%B1%E2

Posted by 톰켓 Trackback 0 Comment 0

그냥 창을 닫아 버리면 문제가 생기죠?
"이 창을 닫으려 합니다. 정말 닫으시겠습니까?'
이런 문구가 나오는데 
그것을 안나오게 하고 그냥 닫고 싶을떄 아래와 같이 하면되요
팝업이 아니라 메인 본체 익스플로러 닫을때 입니다.

  self.opener=self;
  window.close();
Posted by 톰켓 Trackback 0 Comment 0
function isNumber(obj) {
if ( isNaN(obj.value) ) {
 alert("숫자 외에는 입력할 수 없습니다.");
 obj.value="";
 obj.focus();
 return false;
}
return true;
}
Posted by 톰켓 Trackback 0 Comment 0
JAVA 1.3 버전에서는 String.replace를 지원하지 않습니다.
그것을 대용하기 위하여 
Stringtokenizer을 이용하여
만든것입니다.

       String strRepString = "";
       StringTokenizer sStrTkn;
       sStrTkn = new StringTokenizer(CC_DESC[a], "\r\n");
       while(sStrTkn.hasMoreTokens())
       {
        strRepString = strRepString + sStrTkn.nextToken();
        if(sStrTkn.hasMoreTokens())
        {
         strRepString = strRepString + "<br>";
        }
       } 
Posted by 톰켓 Trackback 0 Comment 0
 <script language="JavaScript">
 window.print();
 </script>
Posted by 톰켓 Trackback 0 Comment 0
      int tokensize=0;
      StringTokenizer st = new StringTokenizer(DISP_NAME[a],"@");
      tokensize=st.countTokens();
Posted by 톰켓 Trackback 0 Comment 0

import java.awt.*;
import java.awt.event.*;

public class Calculator extends Frame implements ActionListener
{

 //Variables
 private Button keysArray[];
 private Panel keyPad;
 private TextField lcdScreen;
 private double result;
 private boolean first;
 private boolean foundKey;
 static boolean clearText;
 private int prevOperator;

 //Constructor
 public Calculator()
 {
  lcdScreen = new TextField(20); //display for values
  keyPad = new Panel();          //container for buttons
  keysArray = new Button[16];    //calculator buttons
  result = 0.0;                  //holds result
  prevOperator = 0;              //last operator button pushed
  first = true;                  //
  clearText = true;              //


  //Set frame layout manager
  setLayout(new BorderLayout());

  lcdScreen.setEditable(false);  //user can't enter text


  //Create Buttons
  for (int i = 0; i <= 9; i++)
  {
   //set each button label to the value of index
   keysArray[i] = new Button(String.valueOf(i));
  }


  //create operator buttons
  keysArray[10] = new Button("/");
  keysArray[11] = new Button("*");
  keysArray[12] = new Button("-");
  keysArray[13] = new Button("+");
  keysArray[14] = new Button("=");
  keysArray[15] = new Button(".");


  //Set panel layout manager for a 4 by 4 grid
  keyPad.setLayout(new GridLayout(4,4));

  //Add buttons to keypad panel starting at top left

  //First row
  for( int i = 7; i <= 10; i++)
  {
   //adds buttons 7,8,9 and /
   keyPad.add(keysArray[i]);
  }


  //Second row
  for( int i = 4; i <= 6; i++)
  {
   //adds buttons 4,5,6
   keyPad.add(keysArray[i]);
  }
  //adds *
  keyPad.add(keysArray[11]);


  //Third row
  for( int i = 1; i <= 3; i++)
  {
   //adds buttons 1,2,3
   keyPad.add(keysArray[i]);
  }

  //adds -
  keyPad.add(keysArray[12]);

  //Fourth Row
  //adds 0
  keyPad.add(keysArray[0]);

  for( int i = 15; i >= 13; i--)
  {
   //adds buttons .,=,+
   keyPad.add(keysArray[i]);
  }


  //add to frame
  //add text field to top
  add(lcdScreen, BorderLayout.NORTH);
  //add panel to center
  add(keyPad, BorderLayout.CENTER);

  //activate ActionListener
  for ( int i = 0; i < keysArray.length; i++)
  {
   keysArray[i].addActionListener(this);
  }


  //add WindowListener for closing frame and ending program
  addWindowListener(
    new WindowAdapter()
    {
     public void windowClosing(WindowEvent e)
     {
      System.exit(0);
     }
    }
  );
 }


 //code action
 public void actionPerformed(ActionEvent e)
 {
  //in case no button was pushed
  foundKey = false;

  //Search for the button pressed till end of array or key found
  for ( int i = 0; (i < keysArray.length) && !foundKey; i++)
  {

   if(e.getSource() == keysArray[i])
   {
    //keymatch found
    foundKey = true;
    switch(i)
    {
    case 0: //number 0
    case 1:
    case 2:
    case 3:
    case 4:  //thru
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:  //number 9
    case 15: //decimal point

     //if this is first button pushed
     if(clearText)
     {
      lcdScreen.setText("");
      clearText = false;
     }

     //add the button selected to what was in the display
     lcdScreen.setText(lcdScreen.getText() + keysArray[i].getLabel());
     break;

     //check for operators
    case 10: //divide button
    case 11: //multiply button
    case 12: //minus button
    case 13: //plus button
    case 14: //equal button

     //set to clear display
     clearText = true;

     if (first) //first operand
     {
      if(lcdScreen.getText().length() == 0)
       //if there is nothing in the display
       result = 0.0;
      else

       result = Double.valueOf(lcdScreen.getText()).doubleValue();


      first = false;
      prevOperator = i; //save operator index value
     }


     else //second operand entered, calculate total
     {
      switch(prevOperator)
      {
      case 10: //divide button
       result /= Double.valueOf(lcdScreen.getText()).doubleValue();
       break;

      case 11: //multiply button
       result *= Double.valueOf(lcdScreen.getText()).doubleValue();
       break;

      case 12: //minus button
       result -= Double.valueOf(lcdScreen.getText()).doubleValue();
       break;

      case 13: //plus button
       result += Double.valueOf(lcdScreen.getText()).doubleValue();
       break;
      }

      //write answer to display
      lcdScreen.setText(Double.toString(result));


      if (i == 14) //equal button
       first = true;
      else
       prevOperator = i; //save previous operator
     }
     break;
    }
   }
  }
 }


 public static void main(String args[])
 {
  System.out.println("Starting Calculator...");
  Calculator calcFrame = new Calculator();

  //Set frame attributes
  calcFrame.setBounds(100,100,200,200);
  calcFrame.setTitle("Calculator");
  calcFrame.setVisible(true);
 }


}

Posted by 톰켓 Trackback 1 Comment 0
1.       다운로드 설치

1.1.       다운로드

파일업로드를 구현하기 위해서는 먼저 jakarta에서 제공하는 commons-fileupload.jar commons-io.jar파일이 필요하다.

http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi

http://jakarta.apache.org/site/downloads/downloads_commons-io.cgi

여기서 최신버전을 zip파일로 다운을 받도록한다.

현재 시스템에는 commons-fileupload-1.2.jar, commons-io-1.3.1.jar를 설치하였다.

 

 

1.2.       설치

다운로드 받은 zip파일을 각각 압축을풀면 commons-fileupload-1.2.jarcommons-io-1.3.1.jar파일 외에도 javadoc.jar파일과 sourc.jar파일도 있지만 필요가 없으니 무시하도록 한다.

각각의 jar파일을 설치할 컨텍스트 아래 WEB-INF/lib 아래에 넣으면 설치는 끝난다.

이클립스에서 작업시 설치된 디렉토리 아래에 commons-fileupload-1.2.jarcommons-io-1.3.1.jar파일을 buildPath잡아주면된다.


2.       FileUpload.java

2.1.       개요

설치후 commons-fileupload에서 제공하는 함수를 이용하여 직접 작업하여도 되지만 필요한기능들을 손쉽게 사용하기 위하여 FileUpload.java파일을 만들었다.

자세한 사용방법은 http://jakarta.apache.org/commons/fileupload/ 를 참조한다.

 

 

2.2.       Source

package common;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * @author Kwon Hong Jae
 * 파일업로드 관련 class
 * (한번에 전송할용량은 100메가를 초과할수 없습니다.)
 *
 * ex)
 * FileUploader fileUploader = new FileUploader(request, "C:\\", 1024*1024*3);
 * Map fileMap = fileUploader.getParamAfterUpload();
 *
 */
public class FileUploader {
 
 private HttpServletRequest request = null;
 private File uploadDir = null;
 private List items = null;
 private Map paramMap = null;
 private long requestLimit = 100*1024*1024; //한번에 업로드 용량은 기본 100메가
 private long fileLimit = 5*1024*1024;  //업로드 가능한 파일의 용량은 기본 5메가
 
 public FileUploader(HttpServletRequest request, String uploadDir) throws Exception{
  this.request = request;
  this.uploadDir = new File(uploadDir);
 
  init();
 }
 
 public FileUploader(HttpServletRequest request, File uploadDir) throws Exception{
  this.request = request;
  this.uploadDir = uploadDir;
 
  init();
 }
 
 public FileUploader(HttpServletRequest request, String uploadDir, long fileLimit) throws Exception{
  this.request = request;
  this.uploadDir = new File(uploadDir);
  this.fileLimit = fileLimit;
  init();
 }
 
 public FileUploader(HttpServletRequest request, File uploadDir, long fileLimit) throws Exception{
  this.request = request;
  this.uploadDir = uploadDir;
  this.fileLimit = fileLimit;
  init();
 }
 
 //초기화 함수
 private void init() throws Exception{
 
  boolean isMultipart = ServletFileUpload.isMultipartContent(request);
  if(!isMultipart){
   throw new Exception("form의 enctype을 multipart/form-data로 하세요...");
  }
 
  //임시저장공간 생성
  DiskFileItemFactory factory = new DiskFileItemFactory();
  factory.setSizeThreshold(1024);  //메모리에 저장할 최대 size
  factory.setRepository(uploadDir); //임시 저장할 위치
 
  //업로드 핸들러 생성
  ServletFileUpload upload = new ServletFileUpload(factory);
  upload.setSizeMax(requestLimit);  //Set overall request size constraint
 
  items = upload.parseRequest(request); //Parse the request
 
  //파람값들을 맵에 셋팅
  processFormField(items);

 }
 
 //폼의 필드값을 map에 저장한다.
 private void processFormField(List items) throws Exception{
  paramMap = new HashMap();
  Iterator iter = items.iterator();
  while (iter.hasNext()) {
   FileItem item = (FileItem) iter.next();
 
   if (item.isFormField()) {
    paramMap.put(item.getFieldName(), item.getString());
   }
  }
 }
 
 //하나의 파일사이즈를 체크한다.
 private void chkFileLimit() throws Exception{
  Iterator iter = items.iterator();
  while (iter.hasNext()) {
   FileItem item = (FileItem) iter.next();
   if (!item.isFormField()) {
    String fileName = new File(item.getName()).getName();
    long fileSize = item.getSize();
    if(fileName != null && !"".equals(fileName)){
     if(fileLimit<fileSize){
      throw new Exception(fileName+" 파일이 " + fileLimit/1024/1024 + "M를 초과하였습니다.\n");
     }
    }
   }
  }
 }
 
 
 /**
  * request상의 모든파일을 업로드한다.<br>
  * 파일명의 중복을 피하기 위해 중복될경우 파일명 뒤에 '0'을 붙여 업로드한다.<br>
  * 업로드후 변경된 파일명과 param들을 map으로 리턴받아 처리한다.
  * @throws Exception
  */
 public Map getParamAfterUpload() throws Exception{
 
  boolean writeToFile = true; //파일에 쓸것인지 구분 플래그
  Iterator iter = items.iterator();

  chkFileLimit(); //파일들의 사이즈 체크
 
  while (iter.hasNext()) {
   FileItem item = (FileItem) iter.next();
   //Process a file upload
   if (!item.isFormField()) {
       String filePath = item.getName();
       File file = new File(filePath);
       String fileName = file.getName();
      
       if(fileName != null && !"".equals(fileName)){
        //파일업로드시...
        if (writeToFile) {
         String updFilePath = uploadDir+fileName;
         String newFilePath = getNewFilePath(updFilePath); //동일한 파일명으로 업로드 될수 있기때문에 파일명이 같을경우 파일명 뒤에 '0'을 붙여 업로드한다.
         File newFile = new File(newFilePath);
         paramMap.put(item.getFieldName(), newFile.getName()); //새로운 파일명을 리턴헤주기 위해 맵에 담는다.
         item.write(newFile);        //파일을 쓴다.
        }
       
        //파일업로드가 아닌  다른출력방식을 사용하고 싶을때...
        /*
        else {
         InputStream uploadedStream = item.getInputStream();
         uploadedStream.close();
        }
         */
       }
   }
  }
  return paramMap;
 }
 
 //새로운 파일명을 생성한다.
 private String getNewFilePath(String filePath){
 
  File file = new File(filePath);
  String sDir = file.getParent();
  File dir = new File(sDir);
  File[] files = dir.listFiles();
 
  for(int i=0; i<files.length; i++){
   String alreadyPath = files[i].getPath();
   if(filePath.equals(alreadyPath)){
    filePath = filePath + "0";
   }
  }
 
  return filePath;
 }
 
 /**
  * request상의 param들을 map으로 반환한다.
  * @return Map
  */
 public Map getParamMap(){
  return paramMap;
 }
 
}


 

3.       사용법

      FileUploader fileUploader = new FileUploader(request, "C:\\", 1024*1024*3);

Map paramMap1 = fileUploader.getParamMap();

Map paramMap2 = fileUploader.getParamAfterUpload();

 

 

  fileUpload객체를 생성한다

    Parameter : requestà 서블릿 컨테이너에서 전달받은 request객체.

                "C:\\" à 파일이 저장될 경로.

                1024*1024*3  à 파일의 최대사이즈.

  request 담겨있는 각각의 param들을 paramMap오브젝트로서 담아온후

    처리한다.(생략가능)

  파일을 업로드 한다. 업로드시 중복을 피하기 위해 파일명뒤에 ‘0’

   붙인다. 때문에 변경된 파일명과 request의 모든 param을 paramMap2오브젝트

      로서 담아온다. fileMap 담긴 param 받아온 처리한다.

 

Map value값은 html에서 넘길시 form태그 아래의 input name 으로서 

    얻어온다.

  Ex) String newFileName = fileMap.get(“file”);

Posted by 톰켓 Trackback 0 Comment 0


티스토리 툴바