Jquery File Upload に日本語ファイル名での不具合
- 評価
- クリップ 0
- VIEW 2,654

退会済みユーザー
ノーマルの状態では問題なく作動するように設置できたのですが
日本語のファイル名に対応させる必要があって
こちら
お茶どうぞ☆・:゚*オォヾ(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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる