質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • jQuery

    6934questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • jQueryプラグイン

    526questions

    jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

Jquery File Upload に日本語ファイル名での不具合

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,529

Sora-tan

score 610

ノーマルの状態では問題なく作動するように設置できたのですが
日本語のファイル名に対応させる必要があって 
こちら 
お茶どうぞ☆・:゚*オォヾ(o´∀`o)ノさんのページを参考にさせて頂いて(というかそのまんま) [sever]→[php]内のindex.phpが下記のソースになりました。
(同ディレクトリの「UploadHandler.php」は一切手を加えていません。)

<?php
/*
 * jQuery File Upload Plugin PHP Example
 * https://github.com/blueimp/jQuery-File-Upload
 *
 * Copyright 2010, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * http://www.opensource.org/licenses/MIT
 */

error_reporting(E_ALL | E_STRICT);
/*=================================
=            myOptions            =
=================================*/
class myOptions{
 function get_server_var($id) {
  return isset($_SERVER[$id]) ? $_SERVER[$id] : '';
 }
 function get_full_url() {
  $https = !empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'on') === 0;
  return
  ($https ? 'https://' : 'http://').
  (!empty($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'].'@' : '').
  (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ($_SERVER['SERVER_NAME'].
   ($https && $_SERVER['SERVER_PORT'] === 443 ||
    $_SERVER['SERVER_PORT'] === 80 ? '' : ':'.$_SERVER['SERVER_PORT']))).
  substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/'));
 }
 function uploadDir(){
  return dirname($this->get_server_var('SCRIPT_FILENAME'));
 }
 function uploadUrl(){
  return $this->get_full_url();
 }
}
$myOptions=new myOptions();
$upDirName='files';
$upDir='/'.$upDirName.'/';

$options=array(
 'upload_dir' => $myOptions->uploadDir().$upDir,
 'upload_url' => $myOptions->uploadUrl().$upDir,
 );
/*-----  End of myOptions  ------*/

require('UploadHandler.php');

class myHandler extends UploadHandler{
    function my_basename($str) {
    $temp = substr(strrchr("/$str",'/'),1);
        return $temp;
    }
        protected function get_version_param() {
        return isset($_GET['version']) ? $this->my_basename(stripslashes($_GET['version'])) : null;
    }

    protected function get_file_name_param() {
        $name = $this->get_singular_param_name();
        return isset($_GET[$name]) ? $this->my_basename(stripslashes($_GET[$name])) : null;
    }

    protected function get_file_names_params() {
        $params = isset($_GET[$this->options['param_name']]) ?
            $_GET[$this->options['param_name']] : array();
        foreach ($params as $key => $value) {
            $params[$key] = $this->my_basename(stripslashes($value));
        }
        return $params;
    }
    protected function trim_file_name($file_path, $name, $size, $type, $error,
        $index, $content_range) {
        $name = trim($this->my_basename(stripslashes($name)), ".\x00..\x20");
        if (!$name) {
            $name = str_replace('.', '-', microtime(true));
        }
        if (strpos($name, '.') === false &&
            preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) {
            $name .= '.'.$matches[1];
        }
        if (function_exists('exif_imagetype')) {
            switch(@exif_imagetype($file_path)){
                case IMAGETYPE_JPEG:
                $extensions = array('jpg', 'jpeg');
                break;
                case IMAGETYPE_PNG:
                $extensions = array('png');
                break;
                case IMAGETYPE_GIF:
                $extensions = array('gif');
                break;
            }
        if (!empty($extensions)) {
            $parts = explode('.', $name);
            $extIndex = count($parts) - 1;
            $ext = strtolower(@$parts[$extIndex]);
            if (!in_array($ext, $extensions)) {
                $parts[$extIndex] = $extensions[0];
                $name = implode('.', $parts);
            }
        }
    }
    return $name;
    }
    function my_scandir($dir) {
        $ignored = array('.', '..', '.svn', '.htaccess');

        $files = array();   
        foreach (scandir($dir) as $file) {
            if (in_array($file, $ignored)) continue;
            $files[$file] = filemtime($dir . '/' . $file);
        }

        arsort($files);
        $files = array_keys($files);

        return ($files) ? $files : false;
    }
    protected function get_file_objects($iteration_method = 'get_file_object') {
        $upload_dir = $this->get_upload_path();
        if (!is_dir($upload_dir)) {
            return array();
        }
        return array_values(array_filter(array_map(
            array($this, $iteration_method),
            $this->my_scandir($upload_dir)
            )));
    }
}$upload_handler = new myHandler($options);


結果、日本語のファイル名でアップロードした際 2点の致命的な不具合が発生しています。

① インデックスに表示されるリンクをクリックしても 「ファイルがありません」となってしまう。
ディレクトリ内にはファイルは存在していますが文字化けしてしまっているため hrefのファイル名が異なってしまっています。

② 一度日本語名のファイルをアップロードするとアクセスしなおした際 インデックの表示は空の状態になります。
これも①同様ディレクトリ内には文字化けしたファイルが存際します。

「jQuery-File-Upload-9.5.2」以降すべてのバージョンで試してみましたが同じ結果でした
HTML・php・javascript すべてのファイルはutf-8で保存しています。

各局何処を直せばいいのか皆目見当がつかず困ってしまっています...。(ノ_ё)

詳しい方がいらっしゃいましたらどうか、解決策をお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

ローカルサーバーの設定が原因だったみたいです
WEBサーバーに設置してみたところ 正常に作動しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • jQuery

    6934questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • jQueryプラグイン

    526questions

    jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。