File upload using Struts Framework

เนื่องจากท่านเบนซ์เรียกร้องมาว่าอยากให้เดโม struts upload ให้ดูหน่อย นั่งไตร่ตรองอยู่พักนึง และก็อืมๆๆ ได้ๆ ทำก็ทำ ฮ่าฮ่า รับปากมาหลายวันและ กว่าจะได้ฤกษ์ทำก็วันนี้แหละ ตอนตีสองครึ่งด้วย ฮ่าฮ่า ได้ข่าวว่าพุ่งนี้เรียนเช้านี่นา แหะๆ มาๆ เริ่มกันดีกว่า หุหุ ตอนแรกก็นานมากกว่าจะนั่งระลึกชาติได้ว่าทำอะไรก่อนอะไรหลัง อันนั้นอันนี้คืออะไร เพราะเรียนมาแล้วไม่ได้ทวน Error500 กันไปหลายรอบ กว่าจะได้ ทำให้เห็นความสำคัญของ struts-config มากขึ้นอีกสามเท่า 55+ (พี่เม้งชวนคุย แว๊ก ตีสามแล้ว)

เริ่มจิงๆ เถอะ ฮ่าฮ่า


ขอเดโมเฉยๆ ละกันนะ ไม่อยากพูดถึงทฤษฎีมาก เพราะง่วง บวกกับ ยังไม่แม่นเท่าไหร่

เริ่มแรก ก็สร้าง Project ขึ้นมาก่อน อย่าลืม เลือกใช้ struts framework ด้วยล่ะ อิอิ ในที่นี้สร้าง project ชื่อ StrutsUpload


จำไม่ได้เหมือนกันว่าจิงๆ มันต้องสร้างอะไรขึ้นมาก่อน ระหว่าง jso กับ strutsActionForm หรือว่าอะไรก็ได้ เอาเป็นว่าขอสร้าง ActionForm ก่อนละกัน ในที่นี้สร้าง strutsActionForm ชื่อ FileActionForm

พอได้ FileActionForm มาแล้วก็ลบ Attribute เดิม กับ setter, getter method ทิ้งไป แล้วก็สร้าง attribute กับ setter, getter อันใหม่ขึ้นมา อันนี้เราจะเอาไว้เก็บ file ที่จะอัพโหลดขึ้นมา

private FormFile file;

public FormFile getFile() {
return file;
}

public void setFile(FormFile file) {
this.file = file;
}
หลังจากนั้นก็ไปแก้ใน method validate ให้มันเช็กว่ามีการรับไฟล์เข้ามาจิงไหม (ซึ่งจิงๆ เอาไปรันแล้ว มันก็ไม่ยอมเช็คให้ - -" ไม่เข้าใจมันเหมือนกัน 555+)
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (getFile() == null) {
errors.add("file", new ActionMessage("error.name.file"));
}
return errors;
}
เพื่อกันลืม ก็ไปใส่ข้อความที่จะให้ขึ้นตอน error ที่ ApplicationResource.properties ใน package com.myapp.struts ก็เพิ่มบรรทัดสุดท้ายเป็น
error.name.file=You must select file first
สังเกตว่า ชื่อ error จะต้องตรงกับ ชื่อ argument ใน ActionMessage ของข้างบนนะ
เสร็จละโปรเจค เอ้ย!! ไม่ใช่ๆ ต่อไปก็มาทำ jsp (ต้องทำก่อนที่จะทำ action นะ ไม่งั้นมันไม่รู้ว่าจะ action ไปที่ไหน)

สร้าง JSP ขึ้นมา ในที่นี้ตั้งชื่อว่า upload.jsp อย่าลืม add taglib ของ struts เข้าไปด้วยนะ
<%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
แล้วก็สร้างฟอร์มสำหรับเลือกไฟล์ที่จะ upload ให้ action ไปที่ uploadFile (ต่อไปก็จะต้องกำหนดเป็น URL-path ของ action)

ก็เป็นอันเสร็จ JSP ต่อไปก็ต้องสร้าง Action ขึ้นมา เพื่อใช้ในการ copy file ที่ได้รับมาจาก jsp เริ่มรู้สึกแล้วสินะว่าทำไมมันต้องสร้างอารายเยอะแยะ ฮ่าฮ่า ก็รู้สึกเหมือนกันนะ แต่เค้าว่ามาอย่างงี้ ก็ต้องจำๆ กันหน่อย ฮึบบบ ^^

สร้าง Action ที่ชื่อ uploadAction อยู่ใน package actions อันนี้เราให้ action กับ upload.jsp






พอสร้างเสร็จลองไปแอบดูใน struts-config จะพบว่ามี mapping เพิ่มขึ้นมา

ต่อไปก็ไปเพิ่มโค้ดใน method ActionForward คือในนี้เราต้องเขียนให้มันรับไฟล์มาจากฟอร์ม แล้วก็เขียนลงไปบนคอมเรา ตำแหน่งไหนก็ว่ากันไป จากการที่ลองแล้ว ถ้าใช้ FileWriter เขียน จะเขียนไฟล์ภาพไรงี้ไม่ได้ แต่ถ้าใช้ FileOutputStream ก็เขียนได้หมด

อันดับแรกก็ให้แปลง ActionForm ที่เป็น parameter ของ method ให้เป็น object ของ FileActionForm ที่เราสร้างเอาไว้ก่อน หลังจากนั้นก็ getFile เข้ามาใส่ใน FormFile แล้วก็ getFilename มาเพื่อที่จะให้เป็นชื่อของไฟล์ที่เราจะบันทึกลงไป
FileActionForm f = (FileActionForm) form;
FormFile file = f.getFile();
String filename = file.getFileName();
หลังจากนั้นก็เปิด FileOutputStream แล้วก็เขียนลงไป แล้วก็ปิด แค่นี้ ก็เสร็จ ฮ่าฮ่า
FileOutputStream fout = new FileOutputStream("c:/" + filename);
fout.write(file.getFileData());
fout.close();
แต่จิงๆ ก็ยังไม่เสร็จนะ ฮ่าฮ่า อีกนิดๆ สังเกตว่าใน method มันจะ return mapping.findForward(SUCCESS);
ซึ่งเราต้องไปสร้างไฟล์ที่จะให้มัน map กับ success ขึ้นมาก่อน ก็สมมติสร้าง success.html ละกัน ข้างในก็พิมข้อความง่ายๆ
แล้วก็ไปเพิ่มตรง ใน struts-config ให้มันรู้จัก success ของเราก่อน

ก็ลองรันดู แล้วก็ลองเลือกไฟล์ไปดู ก็จะพบว่ามันสร้างไฟล์ให้จิงๆ ว๊าวววววววตื่นเต้น

กว่าจะเสร็จ T^T จาตีสี่แล้วววว ตายห่าาา พุ่งนี้เรียนเว็บโปร แงๆๆๆ

ไปนอนละคับพี่น้อง TT

Comments

  1. อ๊ากกกกกกกก

    อารายเยอะแยะมากมาย

    เยี่ยมเลยเทอ ^^

    ReplyDelete
  2. น่ารักจิงๆ เลย

    จุ๊บๆๆ ^3^

    ReplyDelete
  3. ฮิฮิ.... สุโค่ยจิงๆ ขอบคุณมากนะจ๊า อาจจะได้ใช้อีกแล้ว ^^

    ReplyDelete
  4. จะถามว่า มีปัญหาเรื่องชื่อไฟล์ที่เป็นภาษาไทยรึเปล่าครับ

    ผมทำแล้วตอนแรกก็ ได้มั่วๆมา ธเนธนธนเนเธ.png ประมาณนี้อ่ะ

    แล้วพอทำแบบนี้แล้ว
    String fileName = new String(fileObject.getFileName().getBytes(),"UTF-8");

    ก็ได้ชื่อที่ดีกว่าเดิมอ่ะ
    น้องเป็ด.png --> อเ.png

    ประมาณนี้ครับ รบกวนตอบด้วยครับ

    ReplyDelete

Post a Comment

Popular posts from this blog

Skiing @ Inawashiro

French Toast

ณ ไอทีลาดกระบัง