Upload file ผ่าน Web Service ด้วย Apache Axis1

ผมได้รับโจทย์มาว่า “ให้เขียน Client เรียก Web Service เพื่อ upload file” ซึ่งก็ไม่ยากเพราะว่า Java มี API สำหรับการแนบไฟล์ไปกับ SOAP อยู่แล้วชื่อ SAAJ (SOAP with Attachments API for Java) แค่อ่านไฟล์เป็น byte[] แล้วก็ Attach เข้าไปใน SOAP ก็จบหล่ะ แต่ปัญหาจริงๆ ของผมคือ ยังไม่เคยเขียน Web Service สำหรับรับไฟล์นี่ซิ ก็เลยเป็นที่หาที่ต้องเขียนบล็อกเก็บไว้

เครื่องมือที่ใช้


  • Eclipse Kepler
  • Apache Tomcat 6.0
  • Apache Axis1 (แถมมากับ Eclipse อยู่แล้ว)
  • Apache Commons IO

สร้าง Web Service


โดยปกติแล้ว Eclipse สามารถคลิกขวาที่คลาสแล้วเลือก Generate Web Service ก็สามารถทำได้แล้ว แต่ปัญหาคือผมจะรับ parameter อย่างไร เพราะว่าถ้ารับเป็น Data type ประเภท File ก็ไม่สามารถ Gen ได้เนื่องจากไม่รองรับการแปลงข้อมูลในรูปแบบ JAX-RPC ได้ (Servlet ของ Axis1 ทำการ Implement Web Service แบบ JAX-RPC) ซึ่ง Data type ที่รองรับ JAX-RPC ดูได้จาก http://docs.oracle.com/javaee/1.4/tutorial/doc/JAXRPC4.html ซึ่งไม่มี File อยู่ในนั้น
ผมก็เลยนึกได้ว่า ผมเขียน Client โดยการอ่านไฟล์เป็น byte[] แล้วแนบมากับ SOAP แล้วในลิงก์ข้างบนก็รองรับ Array ของ Primitives ด้วย ซึ่งก็คือมันรองรับ byte[] นั่นเอง
ผมก็เลยสร้างโปรเจคบน eclipse แบบ dynamic web project ขึ้นมา

  1. แล้วเขียน Class ขึ้นมาเพื่อนำไป Generate เป็น Web Service ดังนี้
    package ws;
    
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    
    import org.apache.commons.io.IOUtils;
    
    public class Upload {
    	
    	private static final String UPLOAD_FOLDER = "E:/workspace/upload/";
    
    	public boolean upload(byte[] file) {
    
    		// Create target folder
    		File folder = new File(UPLOAD_FOLDER);
    		if (!folder.exists() || !folder.isDirectory()) {
    			folder.mkdirs();
    		}
    		
    		// Create target file
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US);
    		File target = new File(UPLOAD_FOLDER, sdf.format(new Date()));
    		if(!target.exists() || !target.isFile()){
    			try {
    				target.createNewFile();
    				
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    		
    		// Copy file byte array to target
    		try {
    			IOUtils.copy(new ByteArrayInputStream(file), new FileOutputStream(target));
    			return true;
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    		return false;
    	}
    }
    
    
  2. คลิกขวาที่คลาสข้อที่หนึ่งแล้วเลือกดังภาพ
    generate jax-rpc web service
    หน้าถัดไปก็กด Finish แล้วก็รอจน Tomcat Start เสร็จก็จบหลักสูตร Web Service
  3. หากไม่มี Error ตอน Start Tomcat ให้ทดสอบเข้า URL ดังนี้ http://localhost:8080/ws/services/Upload?wsdl
    upload web service
    ถ้าขึ้นดังรูปแสดงว่าถูกต้องแล้ว
  4. ผมสร้าง Web Service Client แบบ Console ธรรมดา ผมจึงสร้าง Java Project ขึ้นมาหนึ่งอันแล้วทำการคลิกขวาที่โปรเจค แล้วเลือก New -> Web Service Client
    eclipse gen ws menu
  5. วาง URL แล้วไม่มีข้อความ Error ตรง highlight สีเหลือง ก็กด Finish ได้เลย
    paste url ws
  6. สร้างคลาสเพื่อเรียก Client ดังนี้

    package client;
    
    import java.io.File;
    import java.io.IOException;
    import java.rmi.RemoteException;
    
    import javax.xml.rpc.ServiceException;
    
    import org.apache.commons.io.FileUtils;
    
    import ws.Upload;
    import ws.UploadServiceLocator;
    
    public class App {
    
    	public static void main(String[] args) {
    		try {
    			
    			String uploadFilepath = "E:/workspace/data.txt";
    			
    			Upload service = new UploadServiceLocator().getUpload();
    			boolean status = service.upload(FileUtils.readFileToByteArray(new File(uploadFilepath)));
    			
    			System.out.println("Upload file complete: " + status);
    			
    		} catch (ServiceException e) {
    			e.printStackTrace();
    		} catch (RemoteException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    	}
    
    }
    
  7. เมื่อรันโปรแกรมถ้าไม่พบ Error ก็ให้ไปตรวจสอบที่โฟลเดอร์ปลายทาง ถ้าพบไฟล์ก็ขอแสดงความยินดีด้วย คุณสำเร็จวิชา Upload file ด้วย Web Service แล้ว
    ws file uploaded

One thought on “Upload file ผ่าน Web Service ด้วย Apache Axis1

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s