แชร์ผ่าน


วิธีการ: จัดเก็บข้อมูลใน OneLake

ทุกรายการ Fabric สามารถเข้าถึงที่เก็บข้อมูล OneLake ซึ่งให้วิธีที่ปลอดภัยและปรับขนาดได้ในการจัดเก็บไฟล์ที่เกี่ยวข้องกับรายการของคุณ คู่มือนี้อธิบายวิธีการอัปโหลดไฟล์ไปยังรายการ Fabric ของคุณโดยใช้ และ FabricPlatformAPIClientOneLakeClientพื้นฐาน .

ทําความเข้าใจการจัดเก็บรายการใน Fabric

แต่ละรายการใน Fabric มีพื้นที่จัดเก็บเฉพาะใน OneLake ที่เก็บข้อมูลนี้ถูกจัดระเบียบเป็นโฟลเดอร์ โดยมีโฟลเดอร์หลักคือ:

  • ไฟล์ - สําหรับจัดเก็บไฟล์และเอกสารทั่วไป
  • ตาราง - สําหรับจัดเก็บข้อมูลตาราง

ข้อกําหนดเบื้องต้น

ก่อนอัปโหลดไฟล์ไปยังสินค้า คุณต้องมีสิ่งต่อไปนี้

  • พื้นที่ทํางาน Fabric ที่ถูกต้อง
  • รายการที่มีอยู่ซึ่งคุณต้องการอัปโหลดไฟล์
  • สิทธิ์ที่เหมาะสมในการเขียนไปยังรายการ

การสร้าง FabricPlatformAPIClient

ขั้นแรก ให้สร้าง FabricPlatformAPIClient อินสแตนซ์:

import { getWorkloadClient } from "../controller/WorkloadClient";
import { FabricPlatformAPIClient } from "../clients/FabricPlatformAPIClient";

// Create client using the current user's context
const fabricClient = FabricPlatformAPIClient.create(getWorkloadClient());

ตัวอย่าง: การอัปโหลดไฟล์ข้อความไปยังรายการ

ต่อไปนี้เป็นวิธีอัปโหลดไฟล์ข้อความไปยังรายการโดยใช้ไคลเอ็นต์ OneLake:

async function uploadTextFileToItem(
  workspaceId: string, 
  itemId: string, 
  fileName: string, 
  content: string
) {
  try {
    // Get the FabricPlatformAPIClient
    const fabricClient = FabricPlatformAPIClient.create(getWorkloadClient());
    
    // Access the OneLake client
    const oneLakeClient = fabricClient.oneLake;
    
    // Generate the file path in OneLake for this item
    // This follows the pattern: workspaceId/itemId/Files/fileName
    const filePath = oneLakeClient.constructor.getFilePath(workspaceId, itemId, fileName);
    
    // Write the text content to the file
    await oneLakeClient.writeFileAsText(filePath, content);
    
    console.log(`Successfully uploaded ${fileName} to item ${itemId}`);
    return true;
  } catch (error) {
    console.error("Error uploading file to item:", error);
    throw error;
  }
}

ตัวอย่าง: การอัปโหลดไฟล์ไบนารีไปยังรายการ

สําหรับไฟล์ไบนารี เช่น รูปภาพหรือ PDF คุณต้องแปลงไฟล์เป็น base64 ก่อน:

async function uploadBinaryFileToItem(
  workspaceId: string,
  itemId: string,
  fileName: string,
  fileData: ArrayBuffer // Binary file data
) {
  try {
    const fabricClient = FabricPlatformAPIClient.create(getWorkloadClient());
    const oneLakeClient = fabricClient.oneLake;
    
    // Convert binary data to base64
    const base64Content = arrayBufferToBase64(fileData);
    
    // Generate the file path
    const filePath = oneLakeClient.constructor.getFilePath(workspaceId, itemId, fileName);
    
    // Write the binary content to the file
    await oneLakeClient.writeFileAsBase64(filePath, base64Content);
    
    console.log(`Successfully uploaded binary file ${fileName} to item ${itemId}`);
    return true;
  } catch (error) {
    console.error("Error uploading binary file to item:", error);
    throw error;
  }
}

// Helper function to convert ArrayBuffer to base64
function arrayBufferToBase64(buffer: ArrayBuffer): string {
  let binary = '';
  const bytes = new Uint8Array(buffer);
  const len = bytes.byteLength;
  
  for (let i = 0; i < len; i++) {
    binary += String.fromCharCode(bytes[i]);
  }
  
  return btoa(binary);
}

ตัวอย่าง: การอัปโหลดไฟล์จากเบราว์เซอร์

หากคุณกําลังสร้างเว็บอินเตอร์เฟส คุณสามารถใช้ฟังก์ชันนี้เพื่อจัดการการอัปโหลดไฟล์จากการป้อนไฟล์:

async function handleFileUpload(
  workspaceId: string,
  itemId: string,
  fileInputElement: HTMLInputElement
) {
  if (!fileInputElement.files || fileInputElement.files.length === 0) {
    console.warn("No file selected");
    return false;
  }
  
  const file = fileInputElement.files[0];
  const fileName = file.name;
  
  try {
    // Read the file as ArrayBuffer
    const fileBuffer = await readFileAsArrayBuffer(file);
    
    // Upload based on file type
    if (file.type.startsWith('text/')) {
      // For text files, convert to string and upload as text
      const textDecoder = new TextDecoder();
      const textContent = textDecoder.decode(fileBuffer);
      
      return await uploadTextFileToItem(workspaceId, itemId, fileName, textContent);
    } else {
      // For binary files, upload as base64
      return await uploadBinaryFileToItem(workspaceId, itemId, fileName, fileBuffer);
    }
  } catch (error) {
    console.error("Error processing file upload:", error);
    throw error;
  }
}

// Helper function to read file as ArrayBuffer
function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer> {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result as ArrayBuffer);
    reader.onerror = reject;
    reader.readAsArrayBuffer(file);
  });
}

การจัดการไฟล์ในรายการของคุณ

เมื่ออัปโหลดไฟล์แล้ว คุณยังสามารถ:

ตรวจสอบว่ามีไฟล์อยู่หรือไม่

async function checkFileExists(workspaceId: string, itemId: string, fileName: string) {
  const fabricClient = FabricPlatformAPIClient.create(getWorkloadClient());
  const filePath = fabricClient.oneLake.constructor.getFilePath(workspaceId, itemId, fileName);
  
  return await fabricClient.oneLake.checkIfFileExists(filePath);
}

อ่านเนื้อหาไฟล์

async function readTextFile(workspaceId: string, itemId: string, fileName: string) {
  const fabricClient = FabricPlatformAPIClient.create(getWorkloadClient());
  const filePath = fabricClient.oneLake.constructor.getFilePath(workspaceId, itemId, fileName);
  
  return await fabricClient.oneLake.readFileAsText(filePath);
}

ลบไฟล์

async function deleteFile(workspaceId: string, itemId: string, fileName: string) {
  const fabricClient = FabricPlatformAPIClient.create(getWorkloadClient());
  const filePath = fabricClient.oneLake.constructor.getFilePath(workspaceId, itemId, fileName);
  
  await fabricClient.oneLake.deleteFile(filePath);
  console.log(`File ${fileName} deleted successfully`);
}

แนวทางปฏิบัติแนะนําสําหรับการอัปโหลดไฟล์

  • ใช้รูปแบบไฟล์ที่เหมาะสม: พิจารณาวัตถุประสงค์ของไฟล์และใช้รูปแบบที่ได้รับการสนับสนุนอย่างกว้างขวาง
  • จัดการข้อผิดพลาดอย่างสง่างาม: รวมการจัดการข้อผิดพลาดสําหรับปัญหาเครือข่ายหรือปัญหาการอนุญาตเสมอ
  • ตรวจสอบขนาดไฟล์: ไฟล์ขนาดใหญ่อาจใช้เวลาในการอัปโหลดและประมวลผลนานขึ้น
  • ตรวจสอบสิทธิ์: ตรวจสอบว่าผู้ใช้มีสิทธิ์ที่เหมาะสมก่อนที่จะพยายามอัปโหลด
  • ใช้คํานําหน้าไฟล์หรือโฟลเดอร์: สําหรับรายการที่ซับซ้อนที่มีไฟล์จํานวนมาก ให้พิจารณาจัดระเบียบรายการเหล่านั้นในโฟลเดอร์ย่อย

การใช้ OneLakeClientItemWrapper

สําหรับการเข้าถึงไฟล์รายการที่ง่ายขึ้นคุณสามารถใช้:OneLakeClientItemWrapper

async function uploadFileWithItemWrapper(item, fileName, content) {
  const fabricClient = FabricPlatformAPIClient.create(getWorkloadClient());
  
  // Create a wrapper for simpler access to this specific item
  const itemWrapper = fabricClient.oneLake.createItemWrapper({
    workspaceId: item.workspaceId,
    itemId: item.id
  });
  
  // Upload directly to the item (no need to specify paths)
  await itemWrapper.writeFileAsText(fileName, content);
  
  // Read the file back
  const fileContent = await itemWrapper.readFileAsText(fileName);
  
  console.log(`File uploaded and read back: ${fileContent.substring(0, 50)}...`);
}

ตัวห่อนี้ช่วยลดความยุ่งยากในการทํางานของไฟล์โดยจัดการการสร้างเส้นทางแบบเต็มโดยอัตโนมัติ