[K2 SmartForms]-Upload File แบบใหญ่ๆ

สวัสดีครับ กลับมาเจอกันอีกแล้วในปลายปีที่เหมาะกับการไปเที่ยว แต่หลายๆ คนก้ไม่ได้ไปเที่ยว ยังต้องนั่งทำงานอยู่ (เหมือนผม T^T)  คราวนี้เราจะพูดถึงเรื่องที่เกือบทุก application ต้องใช้ นั่นก็คือ ไฟล์แนบ

โดยปกติไฟล์แนบที่ใช้กันใน application จะมีทางเลือกในการเก็บไฟล์ตามด้านล่าง

  1. เก็บไฟล์ใน database => สะดวก, สามารถแยก archive ได้ แต่ถ้าเก็บเยอะๆ หรือไฟล์ขนาดใหญ่ ก็จะมีปัญหาเรื่อง performance
  2. เก็บไฟล์ใน share path => เก็บไฟล์ขนาดใหญ่ได้ แต่ archive ลำบาก และในส่วนของ K2 จะต้องลง component เพิ่มเพื่อเก็บ file ลง share drive
  3. เก็บไฟล์ใน system อื่น => ที่เคยเจอมาก็เป็น SharePoint (แต่สุดท้ายก็ลงใน database อยู่ดี), WebService (ที่ไม่รู้เอาไปเก็บปลายทางไว้ที่ไหน) หรืออาจจะเป็น Document Management อย่างอื่นๆ

ในด้าน Document Management Solution ที่เกี่ยวกับ K2 ปกติจะเป็นการใช้ K2 + SharePoint โดย K2 จะเป็นตัวช่วยในการทำ application และ SharePoint จะเป็น storage ในการเก็บไฟล์ ถ้าเป็นไฟล์ขนาดเล็ก ก็คงไม่ค่อยมีปัญหาอะไร แต่ถ้าต้องเก็บไฟล์ขนาดใหญ่ล่ะ จะทำอย่างไรดี???

มาดูในฝั่ง K2 กันก่อน จาก recommendation K2 จะรองรับไฟล์ขนาดประมาณ 300 MB (ผ่านการเรียก SmartObject เพื่อ save ไฟล์ลง database) แต่ถ้าเกินกว่านี้ ไม่แนะนำ และอาจจะเจอ error ได้ ดังนั้น option ที่มีคือ การเก็บไฟล์ตรงไปที่ destination ตรงๆ เลย พอคิดได้แล้ว ก็จะมีคำถามอยู่ในใจว่า เราจะสามารถเอา file มาจาก file attachment control ของ SmartForms มา upload ได้อย่างไร?

การทำงานของ file attachment control ก็จะเหมือน control สำหรับทำ file attachment ทั่วไป คือ จะ load file ไปวางไว้ใน temporary folder ซักที่หนึ่ง แล้วค่อยเอา file ไปใช้งานต่อ โดยจะใช้ temporary folder structure ตามด้านล่าง

TempFilePath Info

(A) – เป็น fix path อยู่ใน C:\ProgramData\IsolatedStorage

(B) – จะต่างกันไปตามแต่ละ server

(C) – จะเหมือนกันในทุก server คือ StrongName.sv3o0piwfpl3mmnmzxoxnb4xggpgeagc\AssemFiles

(D) – จะ generate ใหม่ทุกครั้งที่แนบ file สามารถหาได้จาก file attachment control

TempFilePath

เมื่อเลือก file เพื่อ upload ไปแล้ว เวลาดึงข้อมูลออกมาจาก file attachment control จะได้มาในรูปของ xml ตามด้านล่าง

<collection>TestC.txt4uko05zx.hsd\TestC.txt</collection>

โดยตัวที่ผมทำเป็นตัวหนาไว้ ก็คือค่า (D) นั่นเอง สำหรับ solution ที่ผมได้ทดลองทำจะเป็นการ upload file ขึ้น SharePoint สิ่งที่ผมทำมีดังนี้

  1. เอา xml ที่เห็นด้านบน มาตัด เพื่อหาชื่อ file และมาต่อกับ temporary folder เพื่อสามารถเปิดอ่าน file ขึ้นมาได้

//fileInfo คือ

string fileName = fileInfo.Substring(fileInfo.IndexOf(“‘FileName’><value>”) + 18, (fileInfo.IndexOf(“</v”) – fileInfo.IndexOf(“‘FileName’><value>”) – 18));

string fileExtension = fileName.Substring(fileName.IndexOf(“.”));

string currentDate = DateTime.Now.ToString(“yyyyMMddHHmmssff”);

//Rename file name to be unique => ใส่วันที่ และเวลาเพื่อให้ชื่อ file ไม่ซ้ำ
fileName = fileName.Replace(fileExtension, “”) + “-” + currentDate + fileExtension;

 

string filePath = fileInfo.Substring(fileInfo.IndexOf(“‘FilePath'”));
filePath = filePath.Substring(filePath.IndexOf(“‘FilePath’><value>”) + 18, (filePath.IndexOf(“</v”) – filePath.IndexOf(“‘FilePath’><value>”) – 18));

//หา file path มาแล้ว ต่อด้วย .temp เพราะตอน file ถูกใส่ใน temporary folder control จะ add .temp ให้หลังชื่อ file
filePath = tempFilePath + filePath + “.temp”;

2.  ใช้ FileStream class สำหรับอ่าน file ขึ้นมาเป็น stream

FileStream contentStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);

3.  Upload file ขึ้น SharePoint

//Url ที่ใช้ต้องเป็น url ถึงระดับ site ที่ต้องการ เช่น http://portal/sites/TestSite

ClientContext ctx = new ClientContext(sharePointUrl);

Web web = ctx.Web;

FileCreationInformation flciNewFile = new FileCreationInformation();
flciNewFile.ContentStream = contentStream;
flciNewFile.Url = fileName;
flciNewFile.Overwrite = true;

List docs = web.Lists.GetByTitle(libraryName);
Microsoft.SharePoint.Client.File uploadFile = docs.RootFolder.Files.Add(flciNewFile);
ctx.Load(uploadFile);
ctx.ExecuteQuery();

หลังจากสร้างเป็น class เรียบร้อย เราก็สามารถเอา class นี้ไปเรียกใช้ผ่าน SmartObject ได้เป็นอันเสร็จพิธี 🙂  แล้วพบกันใหม่คราวหน้าครับ

อนึ่ง. ได้ทดลองและทดสอบกับ K2 4.6.9 + SharePoint Foundation 2013 ถ้าเอาไปใช้กับ version อื่น โปรดตรวจสอบความถูกต้องก่อนใช้

อสอง. reference link ของ SharePoint upload large file มาจาก https://msdn.microsoft.com/en-us/library/office/dn904536.aspx

Advertisements

2 thoughts on “[K2 SmartForms]-Upload File แบบใหญ่ๆ

  1. วิธีแบบนี้ มันจะต่างกับใช้ File Service Broker ให้ชี้ไปที่ WebDav(Folder Doc Lib) ของ SharePoint หรือเปล่าครับ

    Like

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