ในโครงการระบบ SharePoint ที่ดูแลอยู่ ได้ทดลองทำฟอร์ม Upload ข้อมูลบางอย่างขึ้นมา เป็นฟอร์มง่าย ๆ ที่วาง FileUpload
ไว้บนนั้น
ทีนี้ปัญหามันมาอยู่ตอนอัพโหลดข้อมูล (Microsoft ก็เขียน Code ในลักษณะนี้เช่นกันกับหน้าอัพโหลดของระบบ /_layouts/Upload.aspx
)
folder.Files.Add(GenerateFileNameBasedOnTimeAndUploaderID(Path.GetExtension(DocumentFile.FileName), DocumentFile.FileBytes);
พอลองกับไฟล์เอกสารทั่ว ๆ ไปมันก็ไม่ได้มีปัญหาอะไร แต่พอลองกับไฟล์ที่เป็น Flash .swf
กลับมีปัญหาไม่สามารถอัพโหลดได้โดยมี 2 กรณีคือ
- ผู้ใช้ที่มีสิทธิ์ Contributor (
AddListItems
) จะเจอหน้า Access Denied ซึ่งก็เป็นไปด้วยการป้องกันของตัว SharePoint เองที่ไม่อนุญาตให้อัพโหลดไฟล์ที่อาจจะเป็นหน้าเว็บได้ - ผู้ใช้ที่มีสิทธิ์เป็น 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
มาอุ้มไฟล์นี้ไปก่อน แล้วค่อยหาทางจัดการหลอกผู้มาทีหลัง ให้ไม่ต้องสนใจไฟล์นี้แทน