摘要:完整的模塊代碼文件在上,想直接使用的請(qǐng)前往下載最近吧部署到平臺(tái)的時(shí)候,發(fā)現(xiàn)上傳中文名的文件會(huì)出錯(cuò)。文件保存好,啟用模塊,就可以在文件保存之前,修改文件名,解決中文文件名出錯(cuò)的問題了。
完整的模塊代碼文件在Coding.net上,想直接使用的請(qǐng)前往下載:https://coding.net/u/yamus/p/...
最近吧Drupal8部署到Windows平臺(tái)的時(shí)候,發(fā)現(xiàn)上傳中文名的文件會(huì)出錯(cuò)。找了相關(guān)的模塊,裝上之后錯(cuò)誤依舊。
后來發(fā)現(xiàn)錯(cuò)誤是出在move_uploaded_file這一步的,也就是說必須在文件上傳到服務(wù)器后,Drupal保存文件之前修改文件名,才能避免錯(cuò)誤,于是仔細(xì)查看Drupal8關(guān)于文件處理方面的代碼。發(fā)現(xiàn)表單的文件字段有一個(gè)#value_callback屬性,可以設(shè)置文件上傳后調(diào)用的方法。于是把這個(gè)屬性替換成我自己寫的方法。
首先建立一個(gè)模塊,詳細(xì)步驟就不說了。使用 hook_form_alter 修改字段的 #value_callback屬性。
function chinese_rename_form_alter(&$form, FormStateInterface $form_state, $form_id) { # 檢查文件名 # 獲取表單內(nèi)所有Element $els = Element::children($form); foreach($els as $elName) { if(isset($form[$elName]["widget"])) { foreach($form[$elName]["widget"] as $w => $widget) { if(is_numeric($w)) { if(@$form[$elName]["widget"][$w]["#type"] == "managed_file") { $form[$elName]["widget"][$w]["#value_callback"] = [ "Drupalchinese_renameControllerChineseRenameController", "rename_chinese_filename" ]; } } } } } } #value_callback屬性是一個(gè)數(shù)組,前面是命名空間和類名,后面是方法名。
然后定義一個(gè)控制器,在模塊目錄的src/Controller目錄下??刂破黝惱锩娑x一個(gè)處理文件名的方法,方法是靜態(tài)的。這個(gè)方法接受三個(gè)參數(shù)。
一下是控制器的內(nèi)容。
namespace Drupalchinese_renameController; use DrupalCoreControllerControllerBase; use DrupalCoreFormFormStateInterface; use SymfonyComponentHttpFoundationFileUploadedFile; class ChineseRenameController extends ControllerBase { // 重命名中文文件名 public static function rename_chinese_filename(&$element, $input, FormStateInterface $form_state) { # 如果提交新的文件 if(!is_numeric($input["fids"])) { $form_field_name = implode("_", $element["#parents"]); $all_files = Drupal::request()->files->get("files", array()); // Make sure there"s an upload to process. if (empty($all_files[$form_field_name])) { return NULL; } $file_upload = $all_files[$form_field_name]; // Prepare uploaded files info. Representation is slightly different // for multiple uploads and we fix that here. $uploaded_files = $file_upload; if (!is_array($file_upload)) { $uploaded_files = array($file_upload); } $files = array(); $destination = "temporary://"; $realPath = Drupal::service("file_system")->realpath($destination); foreach ($uploaded_files as $i => $file_info) { # 把源文件對(duì)象替換成重命名過的文件對(duì)象 $originalName = $file_info->getClientOriginalName(); if(preg_match("/[x7f-xff]/", $originalName)) { $newName = md5($originalName) . "." . $file_info->getClientOriginalExtension(); # 新建一個(gè)上傳文件對(duì)象 $newFile = new UploadedFile( $file_info->getRealPath(), $newName, $file_info->getClientMimeType(), $file_info->getClientSize(), $file_info->getError() ); if(count($uploaded_files) <= 1) { $uploaded_files = $newFile; } else { $uploaded_files[$i] = $newFile; } } } $all_files[$form_field_name] = $uploaded_files; Drupal::request()->files->set("files", $all_files); } # 調(diào)用默認(rèn)文件處理方法 return DrupalfilePluginFieldFieldWidgetFileWidget::value($element, $input, $form_state); } }
這里使用MD5處理中文文件名,也可以換成其他的方法。文件保存好,啟用模塊,就可以在文件保存之前,修改文件名,解決中文文件名出錯(cuò)的問題了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22520.html
摘要:自帶的上傳進(jìn)度功能,需要擴(kuò)展支持。于是想到利用的模塊來實(shí)現(xiàn)上傳進(jìn)度。接下來使用模塊替代的文件上傳功能,目的是提高文件上傳的性能。而且可以避免上傳大文件時(shí)執(zhí)行超時(shí)引起錯(cuò)誤。新建一個(gè)對(duì)象,把設(shè)置成剛上傳的文件。 Drupal 8 自帶的上傳進(jìn)度功能,需要PECL uploadprogress library擴(kuò)展支持。安裝后發(fā)現(xiàn)效果還是不太好,不知道什么原因,進(jìn)度條不能正常顯示,而且上傳較大...
摘要:自帶的上傳進(jìn)度功能,需要擴(kuò)展支持。于是想到利用的模塊來實(shí)現(xiàn)上傳進(jìn)度。接下來使用模塊替代的文件上傳功能,目的是提高文件上傳的性能。而且可以避免上傳大文件時(shí)執(zhí)行超時(shí)引起錯(cuò)誤。新建一個(gè)對(duì)象,把設(shè)置成剛上傳的文件。 Drupal 8 自帶的上傳進(jìn)度功能,需要PECL uploadprogress library擴(kuò)展支持。安裝后發(fā)現(xiàn)效果還是不太好,不知道什么原因,進(jìn)度條不能正常顯示,而且上傳較大...
摘要:下載以及相關(guān)模塊下載以及模塊并解壓。接著執(zhí)行,即可完成編譯安裝。運(yùn)行需要的配置首先需要在的上下文里增加一條這條是表示每上傳就更新進(jìn)度信息。 這篇文章的目的是在編譯安裝Nginx的同時(shí),安裝upload和uploadprogress模塊,以及運(yùn)行Drupal 8所需要的配置。由于使用的是Raspberry pi 3B,所以系統(tǒng)用的Raspbian,Debian/Ubuntu應(yīng)該也是差不多...
摘要:上的權(quán)限設(shè)置登錄帳號(hào),進(jìn)入控制面板,登錄后點(diǎn)擊。然后點(diǎn)擊左邊的下的,進(jìn)入主機(jī)列表點(diǎn)擊要設(shè)置權(quán)限的主機(jī)的標(biāo)志進(jìn)入控制面板,或者上方的進(jìn)入文件管理設(shè)置權(quán)限之前,如圖,先選中要設(shè)置權(quán)限的文件夾然后點(diǎn)進(jìn)行讀寫權(quán)限設(shè)置,設(shè)置完成后點(diǎn)擊保存。godaddy上的權(quán)限設(shè)置?登錄Godaddy帳號(hào),進(jìn)入Godaddy控制面板,登錄后點(diǎn)擊MY Account。然后點(diǎn)擊左邊的My Products下的Hostin...
閱讀 2344·2023-04-25 14:29
閱讀 1473·2021-11-22 09:34
閱讀 2714·2021-11-22 09:34
閱讀 3398·2021-11-11 10:59
閱讀 1863·2021-09-26 09:46
閱讀 2238·2021-09-22 16:03
閱讀 1928·2019-08-30 12:56
閱讀 484·2019-08-30 11:12