Tuesday, May 20, 2014

ASP.NET : การเก็บไฟล์ไว้ Server อื่น

   หากเราเขียน ASP.NET จัดเก็บไฟล์ที่ Upload จาก Client ไปยัง Server นั้น ตามปกติจะใช้วิธีการจัดเก็บไฟล์แบบง่ายๆ คือ การเก็บไฟล์ไว้ภายใน Folder ที่อยู่ใน Project ASP.NET นั้นๆ

   แต่เนื่องจากในการออกแบบระบบขนาดใหญ่นั้น จะมีการจำแนก File Server ออกมาต่างหาก จาก Web Server โดยไฟล์ที่ได้ Upload จาก Client ไปนั้น จะถูกนำไปเก็บไว้ที่ File Server แทนที่จะเก็บไว้ที่ Web Server เอง


   สำหรับการใช้ ASP.NET ซึ่งจะต้อง Deploy บน IIS นั้น จะมีเรื่องของ Security ค่อนข้างมาก และดูจะวุ่นวายมาก (ส่วนตัวก็จำได้ไม่หมด) ผมจึงขอสรุปวิธีการหนึ่งที่จะต้องทำ เพื่อให้ Web Application ที่เราเขียนขึ้น สามารถนำไฟล์ไปวางบน File Server หรือ Server อื่นๆ ได้

   วิธีการที่ผมเลือกใช้คือ สร้าง Local User บนเครื่อง File Server และ Web Server ขึ้นมาให้มี User Name และ Password เหมือนกัน **ขอย้ำว่าเป็น Local User นะครับ แต่ถ้าจะใช้เป็น Domain User ก็ได้ไม่ผิดกติกา**
    เช่น user name ชื่อ "usertest" โดยมี password คือ "password"

    บนเครื่อง File Server สร้าง local user ชื่อ usertest

    บนเครื่อง Web Server ก็สร้าง local user ชื่อ usertest เช่นกัน

    บน File Server ให้ Share File โดยให้สิทธิ Modify แก่ usertest

   บนเครื่อง Web Server ให้เปิด IIS ขึ้นมา (เป็น IIS 6.0) จากนั้นเลือกที่ Web Application ที่ต้องการเก็บไฟล์ที่เครื่องแล้วกด New-> Virtual Directory
    กำหนดชื่อ alias เป็น "files" และกำหนด path เป็น "\\FileServer1\testfiles" ที่ได้ shared ไว้แล้ว และกด Next

    กำหนด user name, password ที่จะใช้เข้าถึง shared path นี้ แล้วกด Next

   ยืนยัน password อีกครั้ง








    เลือก permissions: "Read" and "Write"

   เมื่อกำหนด Virtual Directory "files" เสร็จแล้ว จะปรากฏหน้าตาดังรูปต่อไป

   เลือกที่ Web App (สมมติเป็น "TestUpload") --> Properties --> เลือก Tab "Directory Security" --> ที่ Authentication and access control กดปุ่ม "Edit"
    กำหนด user name: เป็น usertest (เป็น local user ของ web server ที่ได้สร้างไว้แล้ว) จากนั้นกดปุ่ม "OK"

   จะมีหน้าจอให้ทราบว่า sub virtual directory จะถูก overrides ตัว user name นี้ด้วย ให้กดปุ่ม OK


   ปรับ Web.Config โดยเพิ่ม

   ข้อดีของวิธีนี้ คือ เราสามารถเขียนโค้ด โดยเรียกใช้ Folder "files" ได้เสมือนเป็น Subfolder ที่อยู่ภายใน Project นี้ได้เลย โดยที่ไม่ต้องสนใจว่า ใน Production Server จะ ชี้ไปยัง Shared Path ใด    เช่น

if (FileUpload1.HasFile)
{
    string psFilename = Server.MapPath("~/files/" + FileUpload1.FileName);

    if (System.IO.File.Exists(psFilename))
        System.IO.File.Delete(psFilename);

        FileUpload1.SaveAs(MapPath("~/files/" + FileUpload1.FileName));
}

   ตัว TestUpload นั้น เป็น Web Application ที่เขียนขึ้นเพื่อทำ Upload files ง่ายๆ โดยเมื่อ user กดปุ่ม "Upload" ตัวโปรแกรมจะทำการตรวจสอบไฟล์ที่ Upload ว่ามีเก็บอยู่ใน \\FileServer1\testFiles\*.* แล้วหรือยัง ถ้ามีแล้วก็จะลบไฟล์ออกไปก่อน จากนั้นจึงทำการจัดเก็บไฟล์ลงไป

   ทดสอบการทำงานของระบบ
   เปิด Web Application ขึ้นมา จากนั้นกด Browse เพื่อเลือกไฟล์ แล้วกด Upload

   หากไม่มีข้อผิดพลาด จะขึ้นข้อความ "Upload file to server successfully."

  ตรวจสอบใน Shared Path จะมีไฟล์ถูกนำมาเก็บไว้เรียบร้อยแล้ว


  จบแล้วครับ ดูแล้วไม่ยาก แต่มีรายละเอียดค่อนข้างเยอะครับ
  ทั้งนี้ เราสามารถประยุกต์ ให้ User Domain แทน Local user ได้ โดยสร้าง user ไว้ที่ Windows Server Domain เลย 1 คน จากนั้น ก็ทำขั้นตอนที่เหลือเหมือนเดิมครับ ท่านก็จะสามารถ Maintain User ที่ตัว Windows Server ได้สะดวกมากขึ้นครับ

   //// NooM ////

No comments: