Skip to main content

เมื่อไฟล์สูญหายไปจาก FileUpload

Submitted by ezybzy on

ในโครงการระบบ SharePoint ที่ดูแลอยู่ ได้ทดลองทำฟอร์ม Upload ข้อมูลบางอย่างขึ้นมา เป็นฟอร์มง่าย ๆ ที่วาง FileUpload ไว้บนนั้น

ทีนี้ปัญหามันมาอยู่ตอนอัพโหลดข้อมูล (Microsoft ก็เขียน Code ในลักษณะนี้เช่นกันกับหน้าอัพโหลดของระบบ /_layouts/Upload.aspx)

folder.Files.Add(GenerateFileNameBasedOnTimeAndUploaderID(Path.GetExtension(DocumentFile.FileName), DocumentFile.FileBytes);

พอลองกับไฟล์เอกสารทั่ว ๆ ไปมันก็ไม่ได้มีปัญหาอะไร แต่พอลองกับไฟล์ที่เป็น Flash .swf กลับมีปัญหาไม่สามารถอัพโหลดได้โดยมี 2 กรณีคือ

  1. ผู้ใช้ที่มีสิทธิ์ Contributor (AddListItems) จะเจอหน้า Access Denied ซึ่งก็เป็นไปด้วยการป้องกันของตัว SharePoint เองที่ไม่อนุญาตให้อัพโหลดไฟล์ที่อาจจะเป็นหน้าเว็บได้
  2. ผู้ใช้ที่มีสิทธิ์เป็น Designer หรือสูงกว่า (จริง ๆ Designer กับ Contributor ก็ไม่ถือว่ามีสิทธิ์อะไรเหนือกว่ากันนะ ต่างกันแค่ Designer จะมีสิทธิ์ AddAndCustomizePages) จะพบปัญหาว่าทุกอย่างใน DocumentFile มันหายไปอย่างไร้ร่องรอยเมื่อถึง Code บรรทัดนี้ (EPIC Fail! เป็นความผิดในขั้นตอนการพัฒนาเลยดึงค่าจาก FileUpload ผิดตัว)

ถ้าบอกให้ถูกคือ กระบวนการ POST ข้อมูลจากฝั่ง Client ไป Server มันก็คงจะเป็นปกติดี แต่ข้อมูลมันน่าจะหายไปในกระบวนการของ HttpModule ซักที่หนึ่ง เนื่องจาก SharePoint มีการเรียกใช้งาน HttpModule พิเศษด้วย

ทางแก้ มี Article บางตัวบอกให้ใช้ PowerShell หรือเขียนโปรแกรมไปแก้ข้อมูลใน SPWebApplication ดึงค่า .swf ออกจาก WebFileExtensions ซึ่งผมลองแล้วไม่ประสบความสำเร็จ ขั้นต่อไปก็คงจะลงไปคุ้ยดู HttpModule แล้วว่าตัดใดที่ทำการดูดเนื้อหาของไฟล์ไป แล้วดูว่าจะทำอะไรกับมันได้บ้าง

เมื่อทำการคุ้ยดูก็พบว่ามี HttpModule ของ SharePoint ที่ชื่อว่า SPRequestModule ซึ่งน่าจะเป็นตัวที่จัดการกับเรื่องนี้

ทางที่พอจะเป็นไปได้สำหรับกรณีนี้คือ อาจจะต้องเขียน HttpModule มาอุ้มไฟล์นี้ไปก่อน แล้วค่อยหาทางจัดการหลอกผู้มาทีหลัง ให้ไม่ต้องสนใจไฟล์นี้แทน

Tags