webuploaderアップロードファイル、中国語ファイル名文字化け
2034 ワード
phpではwebuploaderを使用して画像をアップロードし、フロントエンドに「アップロード済み」と表示されますが、winserverサーバでは画像ファイルが受信されていません.F 12を使用してアップロードが完了して戻ってきた結果、戻ってきたのは{"jsonrpc":"2.0","error":{"code":102,"message":"Failed to open output stream."},"id":"id"}fileupload.phpでfopen()が失敗して戻ってきたことがわかりました.最初はサーバーディレクトリの書き込み権限の問題だと思っていたが、ログインサーバーが設定されて久しく効果がなかった.後で私がアップロードした画像ファイル名が中国語であることを発見しました.「未命名.jpg」です.突然、中国語が文字化けしているのではないかと思い、fopenがファイルを作成したときにパスが間違っていたので、エラーが発生しました.そこでファイル名「a.jpg」を変更し、アップロードに成功し、サーバーからもこの画像を受け取りました.では、現在の問題はファイル名が中国語で文字化けし、fopenのファイル作成に失敗し、サーバ上のファイルが保存できないことです.もしあなたのプロジェクトの規定で、ファイル名に中国語が含まれていないなら、問題はありません.それから、私はまたwebuploaderの中国語の文字化けしの解決方法を調べて、以下のこのような方法を発見して、しかし試してみて、効果がありません:webuploader.jsの中で
変更:
その後、次の方法を見つけて、やっとファイル名に中国語の画像をサーバーにアップロードすることができました.
しかし、もう一つ新しい問題があります.echo fileNameは、フロントエンドに文字化けして表示されています...最後に、私はこのすべての問題が実はfopenによって引き起こされたことを考えて、phpのfopenを調べて、中国語のファイル名を作成するファイルが確かに問題があることを発見して、原因はサーバー環境がwindowsで、そのデフォルトの符号化はansiです.だからfopenのファイルパスに中国語があれば、GBKコードを使う必要があります.実は、上の方法は、私はただ一言しか使いません.
私が受信したファイル名自体がutf-8なので.次に、fileNameをフロントエンドに戻す必要がある場合は、iconv(「GBK」,「UTF-8」,$fileName)を使用します.GBKをUTF-8に変更すればいいです.(一般ページはutf-8としてエンコードされているので)
formData.append( opts.fileVal, blob.getSource(),opts.filename || owner._formData.name || '');
変更:
formData.append( opts.fileVal, blob.getSource(),encodeURI(opts.filename || owner._formData.name || '' ));
その後、次の方法を見つけて、やっとファイル名に中国語の画像をサーバーにアップロードすることができました.
function unicode2utf8($str) {
if (!$str) return $str;
$decode = json_decode($str);
if ($decode) return $decode;
$str = '["' . $str . '"]';
$decode = json_decode($str);
if (count($decode) == 1) {
return $decode[0];
}
return $str;
}
$fileName = unicode2utf8('"' . $fileName . '"');
$fileName = iconv("UTF-8", "GBK", $fileName); // fopen
しかし、もう一つ新しい問題があります.echo fileNameは、フロントエンドに文字化けして表示されています...最後に、私はこのすべての問題が実はfopenによって引き起こされたことを考えて、phpのfopenを調べて、中国語のファイル名を作成するファイルが確かに問題があることを発見して、原因はサーバー環境がwindowsで、そのデフォルトの符号化はansiです.だからfopenのファイルパスに中国語があれば、GBKコードを使う必要があります.実は、上の方法は、私はただ一言しか使いません.
$fileName = iconv("UTF-8", "GBK", $fileName);
私が受信したファイル名自体がutf-8なので.次に、fileNameをフロントエンドに戻す必要がある場合は、iconv(「GBK」,「UTF-8」,$fileName)を使用します.GBKをUTF-8に変更すればいいです.(一般ページはutf-8としてエンコードされているので)