Использование custom_url_rewrite в drupal для статических файлов - PullRequest
0 голосов
/ 09 января 2012

Я хочу написать модуль drupal, который обслуживает статические файлы, но я хочу, чтобы он обслуживал их с адреса www.mydomain.com/moduleName/fileName, где FileName может быть чем угодно (например, javascript / app.js или photos / imageA). .jpg). Я не хочу копировать файлы в это фактическое местоположение, если это возможно, в идеале я хочу, чтобы модуль просто связывал эти два местоположения.

Я попытался использовать меню с обратным вызовом, который выглядит как $ numargs = func_num_args (); $ arg_list = func_get_args ();

$fileName = drupal_get_path('module', 'moduleName') . "/files";
for ($i = 0; $i < $numargs; $i++) {
    $fileName = $fileName . "/" . $arg_list[$i];
}
if ($numargs == 0) {
    $fileName = drupal_get_path('module', 'moduleName') . "/files/index.html";
}

if (file_exists($fileName)) {
    header('Content-Type: ' . getFileMimeType($fileName));
    $handle = fopen($fileName, "r");
    $contents = fread($handle, filesize($fileName));
    fclose($handle);
    echo $contents;
} else {
    drupal_json_output(array('exists' => file_exists($fileName), 'fileName' => $fileName));
}
drupal_exit();

Где getFileMimeType выглядит как

function rcsarooms_getFileMimeType($file) {
    $extension = pathinfo($file, PATHINFO_EXTENSION);
    if ($extension == "html" || $extension == "md") {
        $type = "text/html; charset=utf-8";
    } else if ($extension == "css") {
        $type = "text/css";
    } else if ($extension == "js") {
        $type = "application/x-javascript";
    } else if ($extension == "json") {
        $type = "application/json";
    } else if ($extension == "ico") {
        $type = "image/x-icon";
    } else if ($extension == "png") {
        $type = "image/png";
    } else {
        $type = "charset=UTF-8";
        echo $extension;
        drupal_exit();
        return;
    }
    return $type;
}

но, хотя это прекрасно работает для любых текстовых файлов, оно полностью не работает для любых двоичных файлов (например, png, ico и т. Д.). Мне также не нравится указывать тип mime таким образом.

Вопрос в том, может ли custom_url_rewrite делать то, что мне нужно, и если да, что должна иметь в себе функция перезаписи URL-адреса и куда она должна идти?

Я пробовал это, но, похоже, это не работает:

function custom_url_rewrite($op, $result, $path) {
    if (strpos($result, "data") === false) {
        if ($op == 'alias') {
            if (preg_match('|^' . drupal_get_path('module', 'myModule') . '/files/(.*)|', $path, $matches)) {
                return 'myModule/' . $matches[1];
            }
        }

        if ($op == 'source') {
            if (preg_match('|^myModule/(.*)|', $path, $matches)) {
                return drupal_get_path('module', 'myModule') . '/files/'.$matches[1];
            }
        }
    }

    return $result;
}

1 Ответ

1 голос
/ 09 января 2012

Я только что нашел эту функцию на php.net, которая работает (хотя мне все еще интересно узнать, есть ли у кого-нибудь еще лучший способ сделать это)

function readfile_chunked( $filename) { 
    $chunksize = 1 * (1024 * 1024); // how many bytes per chunk 
    $buffer = ''; 
    $cnt = 0; 
    $handle = fopen( $filename, 'rb' ); 
    if ( $handle === false ) { 
        return false; 
    } 
    ob_end_clean(); //added to fix ZIP file corruption 
    ob_start(); //added to fix ZIP file corruption 
    header( 'Content-Type:' ); //added to fix file corruption 
    header('Cache-Control: max-age=7200'); //time in seconds. so cache for 2 hours
    while ( !feof( $handle ) ) { 
        $buffer = fread( $handle, $chunksize ); 
        echo $buffer; 
        ob_flush(); 
        flush(); 
    } 
    fclose( $handle );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...