Score:0

ไฟล์ส่วนตัวไม่แสดงบนเทมเพลต Twig

ธง ru

ฉันกำลังพยายามรับรูปภาพจากโฟลเดอร์ส่วนตัวเพื่อแสดงบนหน้าเทมเพลต Twig ที่เป็นมิตรกับเครื่องพิมพ์เบราว์เซอร์ไม่สามารถเข้าถึงโฟลเดอร์ส่วนตัวได้ และวิธีการแสดงผลวิธีเดียวที่ฉันรู้คือการโหลดรูปภาพและแปลงเป็น Base64 และส่งอักขระ Base64 ไปยังแอตทริบิวต์ 'src' ขององค์ประกอบ 'img'

รหัสคอนโทรลเลอร์ของฉันมีลักษณะดังนี้:

คลาส PrinterFriendlyController ขยาย ControllerBase {

  เครื่องพิมพ์ฟังก์ชั่นสาธารณะที่เป็นมิตร (ข้อความ $) {

    // โหลดรูปภาพจากไดเร็กทอรีส่วนตัวและแปลงเป็น base64
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $image = $this->entityTypeManager
      ->getStorage('ไฟล์')
      ->โหลด($file_id);
    $image_path = PrivateStream::basePath() '/ภาพ/' . $image->getFilename();
    $image_data = file_get_contents($image_path);
    $image_base64 = 'ข้อมูล:' finfo_file($finfo, $image_path) . ';base64,' . base64_encode($image_data);

    $หน้า = [
      // ยาวเกิน 255 ตัวอักษรแน่นอน
      '#image_base64' => $image_base64,
      // วิธีนี้ใช้ไม่ได้เช่นกัน ดังนั้นจึงไม่ใช่ปัญหาความยาวของอักขระ
      //'#image_base64' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==',
      '#text' => $text,
      '#theme' => 'printer_friendly',
    ];

    กลับหน้า $;
  }
}

ไฟล์เทมเพลตมีลักษณะดังนี้:

<div id="printer-friendly">
  <img src="{{ image_base64 }}" />
  <div id="text">{{ text }}</div>
</div>

องค์ประกอบ 'ข้อความ' มีข้อความที่กำหนดเองซึ่งวางอยู่เหนือองค์ประกอบ 'img' โดยใช้ CSS แต่รวมอยู่ในบริบทเท่านั้น มันไม่เกี่ยวข้องกับปัญหา

ผลลัพธ์ที่ปรากฏใน Chrome Inspect คือ:

<img src="">

หรือ

<img src(unknown)>

Drupal หรือ Twig กำลังบล็อกอักขระรูปภาพ Base64 แต่ฉันไม่รู้ว่าตัวใดกำลังบล็อกอยู่ และฉันไม่รู้วิธีป้องกันไม่ให้ทำเช่นนั้น

MrD avatar
cn flag
MrD
จะเป็นอย่างไรถ้าคุณแก้ไขข้อมูลเช่นบรรทัดของคุณแสดงความคิดเห็น `//'#image_base64' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==',` สามารถแสดงภาพได้หรือไม่
ru flag
ไม่มันไม่ ฉันใช้บรรทัดนั้นเพื่อดูว่าปัญหาเกิดจากการจำกัดจำนวนอักขระหรือไม่ แต่ไม่ใช่ Drupal กำลังกรองสตริง Base64 ออกด้วยเหตุผลอื่นบางประการ
Score:1
ธง cn
MrD

บางทีปัญหาของคุณอาจมาจากธีมของฟังก์ชัน printer_friendly หากคุณกำหนดฟังก์ชั่นนี้ คุณต้องระบุตัวแปรเมื่อกำหนด หากฟังก์ชันนี้มาจากโมดูลสนับสนุน คุณสามารถใช้ hook_preprocess_printer_friendly เพื่อเพิ่มตัวแปรก่อนที่จะแสดงผลในเทมเพลต twig

ru flag
เป็นโมดูลที่กำหนดเองพร้อมเทมเพลต Twig มันมีตัวแปรข้อความหลายอย่างเช่น '#text' ที่แสดงเมื่อเพจแสดงผล นอกจากนี้ ถ้าฉันฮาร์ดโค้ดรูปภาพ Base64 ในเทมเพลตด้วยบางอย่างเช่น '' ภาพแสดงอย่างถูกต้อง เมื่อฉันพยายามส่งตัวแปรสตริงอักขระ Base64 ไปยังแอตทริบิวต์ 'src' ของรูปภาพเท่านั้นที่ Drupal หรือ Twig ไม่อนุญาตและทำให้ว่างเปล่า ฉันรู้ว่าสตริงอักขระ Base64 ถูกบล็อก แต่ฉันไม่รู้ว่าที่ไหน ทำไม หรือมีวิธีแก้ไขหรือไม่ ขอขอบคุณสำหรับการตอบสนองของคุณ.
MrD avatar
cn flag
MrD
คุณลอง {{ image_base64|raw }} แล้วหรือยัง
ru flag
คำตอบของคุณถูกต้อง เพิ่งอ่านครั้งแรกก็ไม่เข้าใจ ฉันจำไม่ได้ว่าเพิ่มตัวแปรใหม่ 'image_base64' ใน 'hook_theme' หลังจากที่ฉันเพิ่มเข้าไปแล้ว การทำงานกับสตริงทดสอบจุดสีแดง Base64 แบบสั้น แต่เมื่อส่งสตริง Base64 อิมเมจขนาด 100+ กิโลไบต์ยาว 'RuntimeException: ล้มเหลวในการเริ่มเซสชันเนื่องจากส่วนหัวถูกส่งไปแล้วโดย...' ล้มเหลวดังนั้นฉันจึงต้องเรียกใช้บริการ 'page_cache_kill_switch' ขอขอบคุณ.
MrD avatar
cn flag
MrD
@ user320691 ทำไมคุณไม่ใช้ไฟล์ส่วนตัว url เริ่มต้น และใช้ hook_file_download เพื่อควบคุม ฉันคิดว่ามันดีกว่าสำหรับคุณ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา