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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

3回答

4554閲覧

文字化け防止のため文字コードを統一したい

syugaaburesu

総合スコア35

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2020/08/03 02:53

編集2020/08/03 09:22

すみません。8/3 18時以降はパソコンがいじれないので結果報告ができません。なので明日になってしまいます。申し訳ありません

テキストファイルをアップロードしてテキストファイルの文字コードがANSI等だと文字化けが起きてしまいます。なので文字化けが起きないよう何らかの手段があれば教えてください

詳しい環境追記致します
WEBサーバ IIS8.0
serverアプリ C# ASP.NET Webフォーム

クライアント環境
GoogleCrome
Internetexplorer11

プログラムの内容を端的に言うとボタンがひとつとテキストエリアが3つあります。ボタンを押すとポップアップが表示され3つのテキストエリアのどこにファイルをアップロードするかの内容と共に3つのボタンが表示されます。ボタンにはそれぞれのテキストエリアと連動していてボタンを押すとファイル選択ダイアログが出現、テキストファイルを指定してサーバにアップロードします。更新すると選択したボタンと連動したテキストエリアにテキストの内容が表示されます

アップロードするテキストファイルは基本SJISやUTF-8等の有名所です。そのままだと文字化けしてしまうのでどの文字コードでもWeb上に表示できるようにしたいです

何度も何度も申し訳ありません。もう少し頑張ってみようと思います
下記関係あるであろうコード記載します
下記コードはファイルをアップロードして表示することは出来ます。テキストファイル内にhtmlを記述するとそれが反映できるようにもなっています。しかし、文字コードがおかしいと文字化けしてしまいます。

html

1<!-- 202007311050 --> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <title></title> 6 <link rel="stylesheet" type="text/css" href="test.css" /> 7</head> 8<body> 9 <script type="text/javascript" src="../common/jquery-3.4.1.min.js"></script> 10 <script type="text/javascript" src="../manage/test.js"></script> 11 12 <div class="version"> 13 var:1.00 14 </div> 15 16 <div class="caption_box1"> 17 <fieldset><legend class="test1">test1</legend> 18 <pre><div class="usertext" id="test1"></div></pre></fieldset> 19 </div> 20 21 <div class="caption_box2"> 22 <fieldset><legend class="test2">test2</legend> 23 <pre><div class="usertext" id="test2"></div></pre></fieldset> 24 </div> 25 26 <div class="caption_box3"> 27 <fieldset><legend class="test3">test3</legend> 28 <pre><div class="usertext" id="test3"></div></pre></fieldset> 29 </div> 30 31 <div class="caption_box4"> 32 <label for="txtfile"> 33 <a id="modal-open" class="button-link">ファイル取込</a> 34 </label> 35 </div> 36 37 <!-- ここからモーダルウィンドウ --> 38 <div id="modal-content"> 39 <form id="fileForm"> 40 <div>アカウント: admin</div> 41 <input type="text" id="password"> 42 <input type="button" id="md5Button" value="認証ボタン"> 43 44 <div class="dummy"> 45 <input type="button" id="dummyButton1" value="test1ボタン"> 46 <input type="button" id="dummyButton2" value="test2ボタン"> 47 <input type="button" id="dummyButton3" value="test3ボタン"> 48 </div> 49 </form> 50 51 <p><a id="modal-close" class="button-link2">閉じる</a></p> 52 <!-- モーダルウィンドウのコンテンツ終了 --> 53 </div> 54</body> 55</html>

JavaScript

1const HOST = "https://192.168.100.204/"; 2const root = HOST + "client/manage/txt/"; 3const test1 = "test1.txt"; 4const test2 = "test2.txt"; 5const test3 = "test3.txt"; 6 7//------------------------------------------ 8// 表示処理を行います 9//------------------------------------------ 10window.onload = function() { 11 $.ajaxSetup({cache: false}); 12 $("#test1").load(root + test1); 13 $("#test2").load(root + test2); 14 $("#test3").load(root + test3); 15 $("#dummyButton1")[0].onclick = onClickDummyButton1; 16 $("#dummyButton2")[0].onclick = onClickDummyButton2; 17 $("#dummyButton3")[0].onclick = onClickDummyButton3; 18 $("#md5Button")[0].onclick = onclickMd5Button; 19} 20 21//------------------------------------------ 22// 認証処理を行います 23//------------------------------------------ 24function onclickMd5Button() { 25 var formData = new FormData(); 26 formData.append("user_name", "admin"); 27 formData.append("password", $("#password")[0].value); // admin 28 29 $.ajax({ 30 url : HOST + "/Server/Server/password_md5_checker.aspx", 31 type : "POST", 32 data : formData, 33 cache : false, 34 contentType : false, 35 processData : false, 36 dataType : "html", 37 async: false 38 }) 39 .done(function(data, textStatus, jqXHR){ 40 if(JSON.parse(data).IsMatchPassword){ 41 document.getElementById("kekka").innerHTML = ""; 42 document.getElementById("upload").innerHTML = ""; 43 document.getElementById('dummyButton1').style.display = 'inline'; 44 document.getElementById('dummyButton2').style.display = 'inline'; 45 document.getElementById('dummyButton3').style.display = 'inline'; 46 }else{ 47 document.getElementById("kekka").innerHTML = "パスワードが間違っています"; 48 document.getElementById("upload").innerHTML = ""; 49 document.getElementById('dummyButton1').style.display = 'none'; 50 document.getElementById('dummyButton2').style.display = 'none'; 51 document.getElementById('dummyButton3').style.display = 'none'; 52 } 53 }); 54} 55//------------------------------------------ 56// アップロード処理を行います1 57//------------------------------------------ 58function onClickDummyButton1() { 59 const input = document.createElement('input'); 60 input.type = 'file'; 61 input.accept = '.txt, text/plain'; 62 input.onchange = function(event) { 63 var formData = new FormData(); 64 formData.append("text", event.target.files[0], test1); 65 66 $.ajax({ 67 url : HOST + "/Server/Server/info_uploader.aspx", 68 type : "POST", 69 data : formData, 70 cache : false, 71 contentType : false, 72 processData : false, 73 dataType : "html", 74 async: false 75 }) 76 .done(function(){ 77 document.getElementById("upload").innerHTML = "test1をアップロードしました"; 78 }); 79 }; 80 input.click(); 81} 82 83//------------------------------------------ 84// アップロード処理を行います2 85//------------------------------------------ 86function onClickDummyButton2() { 87 const input = document.createElement('input'); 88 input.type = 'file'; 89 input.accept = '.txt, text/plain'; 90 input.onchange = function(event) { 91 var formData = new FormData(); 92 formData.append("text", event.target.files[0], test2); 93 94 $.ajax({ 95 url : HOST + "/Server/Server/info_uploader.aspx", 96 type : "POST", 97 data : formData, 98 cache : false, 99 contentType : false, 100 processData : false, 101 dataType : "html", 102 async: false 103 }) 104 .done(function(){ 105 document.getElementById("upload").innerHTML = "test2をアップロードしました"; 106 }); 107 }; 108 input.click(); 109} 110 111//------------------------------------------ 112// アップロード処理を行います3 113//------------------------------------------ 114function onClickDummyButton3() { 115 const input = document.createElement('input'); 116 input.type = 'file'; 117 input.accept = '.txt, text/plain'; 118 input.onchange = function(event) { 119 var formData = new FormData(); 120 formData.append("text", event.target.files[0], test3); 121 122 $.ajax({ 123 url : HOST + "/Server/Server/info_uploader.aspx", 124 type : "POST", 125 data : formData, 126 cache : false, 127 contentType : false, 128 processData : false, 129 dataType : "html", 130 async: false 131 }) 132 .done(function(){ 133 document.getElementById("upload").innerHTML = "test3をアップロードしました"; 134 }); 135 }; 136 input.click(); 137} 138 139//------------------------------------------ 140// モーダルウィンドウ表示処理を行います 141//------------------------------------------ 142$(function(){ 143 $("#modal-open").click( function(){ 144 $( this ).blur() ; 145 if( $( "#modal-overlay" )[0] ) return false ; 146 $( "body" ).append( '<div id="modal-overlay"></div>' ) ; 147 $( "#modal-overlay" ).fadeIn() ; 148 centeringModalSyncer() ; 149 $( "#modal-content" ).fadeIn() ; 150 $( "#modal-overlay,#modal-close" ).unbind().click( function(){ 151 $( "#modal-content,#modal-overlay" ).fadeOut(function(){ 152 $('#modal-overlay').remove() ; 153 } ) ; 154 } ) ; 155 } ) ; 156 157 $( window ).resize( centeringModalSyncer ) ; 158 159 function centeringModalSyncer() { 160 var w = $( window ).width() ; 161 var h = $( window ).height() ; 162 var cw = $( "#modal-content" ).outerWidth(); 163 var ch = $( "#modal-content" ).outerHeight(); 164 165 $( "#modal-content" ).css( {"left": ((w - cw)/2) + "px","top": ((h - ch)/2) + "px"} ) ; 166 } 167} ) ;
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Server { public partial class info_uploader : Page { const string RELATIVE_PATH = "../../Client/Manage/txt/"; readonly string _currentPath = AppDomain.CurrentDomain.BaseDirectory; protected void Page_Load(object sender, EventArgs e) { var file = Request.Files["text"]; if (file == null) return; var filePath = string.Format(@"{0}{1}{2}", _currentPath, RELATIVE_PATH, file.FileName); file.SaveAs(filePath); var response = HttpContext.Current.Response; response.ClearContent(); response.Buffer = false; response.End(); } } }

知人に聞いたところサーバサイドでアップロードしたファイルを開いてUTF形式で保存すればライブラリを使わなくていいとの事でした。先程ご返信頂いた人の中にEncordingConverterというのがあったりするという事だったのでライブラリ云々を考えないでこんな手段があるというのがありましたら教えていただいただけると幸いです

やりたいことを簡潔にしました。タイトル等変更しました。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BluOxy

2020/08/03 03:03 編集

FileReaderで読み込んだ後はどのようなことを実現したいのでしょうか。目的によってはJavaScriptのFileReaderの使用をやめてサーバー(ASP.NET)側から FileStream や リソースファイルを用いてファイルを読み込み、それをブラウザに表示した方が良いかもしれません。
syugaaburesu

2020/08/03 03:08

コメントありがとうございます。 やりたい事としてはencording.jsというライブラリを使ってどんな文字コードでも表示できるようにしたいです。そのためにファイル情報が必要になるので調べてみたところFileReaderというのを見つけました。しかし、サーバにアップロードしたテキストを表示したいのでinputじゃダメなのでどうすればいいのかなという次第です
BluOxy

2020/08/03 03:58

ASP.NET には種類があります(ASP.NET Web Forms や ASP.NET MVC など) それに関連した回答をするかもしれないので、詳しい環境を記載してもらえますか。 > encording.jsというライブラリを使ってどんな文字コードでも表示できるようにしたい encoding.jsを使うことは必須でしょうか。また、ブラウザ側で文字コードの変換を行う事も必須でしょうか。サーバー(C#)からEncoding.Convert メソッドを用いて特定のエンコーディングを行った文字列をページに返すのも手です。 https://docs.microsoft.com/ja-jp/dotnet/api/system.text.encoding.convert?view=netcore-3.1
BluOxy

2020/08/03 04:08 編集

「サーバーにアップロードしたテキストをどんな文字コードでも表示できるようにしたい」が目的に読めるので、それに対する手段を何か(encoding.jsなど)に限定してしまうと、却って煩雑になる場合があります。 今回の場合、ASP.NET側から予め特定のエンコーディングをした文字列をページに埋め込んでしまえばFileReaderでファイルを読み込むという過程は必要なくなり、本来不必要であろう手順を省く事ができるかもしれません。
BluOxy

2020/08/03 04:07 編集

ユーザーの操作によって頻繁に、かつ動的に文字コードを変換しブラウザに表示するような目的であれば、encoding.jsなどのライブラリを使用した方が良いかもしれません。細かい仕様を知らないので、どちらが良いかは分かりません。
syugaaburesu

2020/08/03 04:11

すみません。詳しい環境を記載します。
BluOxy

2020/08/03 04:17

よろしくお願いします。合わせて「どんな文字コードでも表示できるようにしたい」を具体的に書いて頂けると回答しやすいです。 例えば、どのような入力(サーバにアップロードしたテキスト?)があって、どのような出力(ASCIIやUnicode等に変換した各文字コードが書かれたページ?)があるのかが知りたいです。
syugaaburesu

2020/08/03 04:25

追記しました。お手数お掛け致しますが確認お願いします
BluOxy

2020/08/03 04:28

追記ありがとうございます。要件が何となくは理解できました。しかし、あえてinputタグを使わない理由が気になりました。
BluOxy

2020/08/03 04:36 編集

また、サーバー(C#,ASP.NET)は関与しないように思えるので、この2つのタグは解除した方が良いかもしれません。inputタグによるファイルアップロードやFileReaderオブジェクト自体はブラウザ上で動作しているだけであり、サーバーとは無関係です。
退会済みユーザー

退会済みユーザー

2020/08/03 04:38

> やりたい事としてはencording.jsというライブラリを使ってどんな文字コードでも表示できるようにしたいです。そのためにファイル情報が必要になるので調べてみたところFileReaderというのを見つけました。しかし、サーバにアップロードしたテキストを表示したいのでinputじゃダメなのでどうすればいいのかなという次第です 上の「サーバにアップロードしたテキストを表示したい」というところをもっと詳しく具体的に書けませんか? ファイルはサーバーに存在するというところから話が始まるのであれば、「FileReaderで読み込ます」とか「encording.jsというライブラリを使ってどんな文字コードでも表示できるようにしたい」というのは全くの見当違いで、この質問は最初から完全に迷走していると思います。 FileReader とか encording.js は忘れて、最初から考え直した方がよさそうです・・・が、もっと具体的かつ詳細にやりたいことを書いてもらえないとアドバイスするのも難しそうです(勝手に想像してアドバイスすると、想像が違っていた場合混乱を招くばかりですし)。
syugaaburesu

2020/08/03 04:41

inputに関してなのですがfileですと選択しただけで終わってしまいサーバにアップロードする余地がなかったからです(自分の知識不足かもしれません)なのでtype=buttonにしてアップロードする余地を作りました
BluOxy

2020/08/03 04:42

> ファイル選択ダイアログが出現、テキストファイルを指定してサーバにアップロードします。更新すると選択したボタンと連動したテキストエリアにテキストの内容が表示されます を見て想像するに、テキストエリアが動的に更新するようなページが作りたいのだと読めました。 ということはこの文章における「サーバー」という言葉の使い方が不適切であり、おそらくブラウザ≒サーバーになっているのではないかと思いました。 そして、syugaaburesuさんがまず知りたいのは「inputタグを使わずにファイルをブラウザへアップロードする方法」だと読めました。(合っていますか)
退会済みユーザー

退会済みユーザー

2020/08/03 04:45

なぜ ASP.NET のタグを外したのですか? サーバー側の処置が必要が必要なら(必要ですよね?)ASP.NET のタグは外すべきではないですけど。
syugaaburesu

2020/08/03 04:52

すみません、こちらのサイトを使ったのが初めてで困惑してしまいました。 初めてのフレームワークにしてはちょっと荷台が重かったかもしれないです...ブラウザ≒サーバーにはなっていませんが知識不足が招いた結果になってますね。申し訳ありません。
BluOxy

2020/08/03 04:56

> テキストファイルを指定してサーバにアップロードします。更新すると選択したボタンと連動したテキストエリアにテキストの内容が表示されます アップロード後、ページが更新されるのでしょうか(HTTPリクエストが送信されるのか)。 もしくはHTML要素が書き換わるだけでしょうか。 前者ならASP.NETと関係があります。後者はJavaScriptのみで対処できます。
syugaaburesu

2020/08/03 04:59

前者です。POSTで送信します
退会済みユーザー

退会済みユーザー

2020/08/03 05:01

話は通じてますか? アップロードしたテキストファイル(文字コードは Shift_JIS 他いろいろ)をブラウザに表示したいのですよね? であれば、サーバー側(ASP.NET のコード)でテキストファイルを正しい文字コードで読むという操作が必要です。ASP.NET のタグは外せないですよ。 それとも、もうギブアップでこのスレッドでの Q&A は続ける必要はなくなったということですか? それならそれで構いませんので、その旨質問者さんの方で回答欄に書いてこのスレッドはクローズしてください。
BluOxy

2020/08/03 05:03

なんだか混乱を招いていたらすみません。前者ならASP.NETによる手続きが必要ですね。 自分は後者と読めてしまいました。まさにSurferOnWwwさんが仰っていた > 勝手に想像してアドバイスすると、想像が違っていた場合混乱を招くばかり だったようです。
syugaaburesu

2020/08/03 05:07

いえいえ、大丈夫です。自分の知識不足でした。御二方のお時間費やしてしまい本当に申し訳ありません。もっと簡単なやつから勉強したいと思います。ありがとうございましたm(_ _)m
退会済みユーザー

退会済みユーザー

2020/08/03 08:36 編集

追記されたコードを拝見しました。質問者さんが書いたのですか? もし、誰か他の人が書いたコードに手を加えているということなら、書いた人に質問した方が良いと思うのですが、とりあえずそれは置いといて・・・  > 下記コードはファイルをアップロードして表示することは出来ます。 どのタイミングでどこにどのようにして表示しているのですか? 表示するためのコードが見当たりませんが、どれですか? アップロードされたテキストファイルは file.SaveAs(filePath); で物理パス filePath に保存しているのですよね? それがホントにできているかかなり疑問です。間違いなく保存できているのですか? そして、表示というのは具体的にどうやっているのですか? 最初の話では、ASP.NET の C# のコードで物理パス filePath からテキストファイルを読みだしてきて、ページのテキストエリアに表示するという話だったと理解していますが、そのためのコードが見当たりません。 テキストエリアというのは多分 <div class="usertext" id="test1~3" ... のことではないかと思っていますが、どのタイミングでどのようにして書き込んでいるのですか? 物理パス filePath からテキストファイルを読みだして来るというわけではなくて、直接 HttpPostedFile からファイルの中身を読んできて、それをページのテキストエリアに表示するという話なのですか? そうだとしてもそのコードは見当たりませんが、どこにあるのですか?
syugaaburesu

2020/08/03 08:43

こちらは自分で作成しました。サイトからコピーしたものもありますが...大抵は自分です。 >どのタイミングでどこにどのようにして表示しているのですか? 表示するためのコードが見当たりませんが、どれですか? 表示はjsの表示処理を行いますに記載してあります。idにそって.loadで表示してます。 >アップロードされたテキストファイルは file.SaveAs(filePath); で物理パス filePath に保存しているのですよね? それがホントにできているかかなり疑問なのです。間違いなく保存できているのですか? 間違いなくテキストファイルをアップロードしたらそちらに変更されます。動画とかアップロードできたらいいんですけど方法が分かりません
退会済みユーザー

退会済みユーザー

2020/08/03 09:38

> 表示はjsの表示処理を行いますに記載してあります。idにそって.loadで表示してます。 見逃してました・・・が、ajax の応答が返ってきたときにも window.onload イベントは発生するのでしたっけ? > 間違いなくテキストファイルをアップロードしたらそちらに変更されます。 コードの一部は以下のようになっていて、それを連結してパスを取得してましたが、それで間違いなく正しく物理パスが取れるのですか? const string RELATIVE_PATH = "../../Client/Manage/txt/";
syugaaburesu

2020/08/03 09:47

>ajax の応答が返ってきたときにも window.onload イベントは発生するのでしたっけ? 発生しないです。再ロードします >コードの一部は以下のようになっていて、それを連結してパスを取得してましたが、それで間違いなく正しく物理パスが取れるのですか? 少し下のfilepathのところでfile.filenameがあるので大丈夫だと思っていました。実際取れているので大丈夫だと思います
退会済みユーザー

退会済みユーザー

2020/08/03 10:14 編集

> 発生しないです。再ロードします それ、書いてありましたっけ? 全く想定外の話なので分からなかったのですけど・・・ 何にせよ、ページに表示する文字コードはデフォルトで UTF-8 なので、テキストファイルの文字コードがそれ以外の時はどこかで変換してやらないと文字化けすると思います。なので、.load はダメでしょう。 それ以前に、セキュリティ対策に HTML Encode しないとダメですし、改行を <br /> に変換する必要もあるはずです。 info_uploader で文字コードの変換、HTML Encode、改行の <br /> に変換などの必要な処置を行ったらその文字列を応答として返し、それを .done(function() ... の引数で受けて表示するということではいかが? > 実際取れているので大丈夫だと思います "../../Client/Manage/txt/" という文字列を連結してそんなことができるとは考えられないのですが・・・ 実際どういう文字列が取得できているか教えてもらえませんか?
syugaaburesu

2020/08/03 10:36

>info_uploader で文字コードの変換、HTML Encode、改行の <br /> に変換などの必要な処置を行ったらその文字列を応答として返し、それを .done(function() ... の引数で受けて表示するということではいかが? ある程度分かってきました。明日やってみます >"../../Client/Manage/txt/" という文字列を連結してそんなことができるとは考えられないのですが・・・ 実際どういう文字列が取得できているか教えてもらえませんか? 各ボタンクリックで →../../Client/Manage/txt/test1txt" →../../Client/Manage/txt/test2txt" →../../Client/Manage/txt/test3txt" が取得されます
syugaaburesu

2020/08/03 10:38

すみません.が抜けてました
退会済みユーザー

退会済みユーザー

2020/08/03 10:44

> 各ボタンクリックで > →../../Client/Manage/txt/test1txt" > →../../Client/Manage/txt/test2txt" > →../../Client/Manage/txt/test3txt" が取得されます 話が通じてますか? Windows OS のファイルシステムの物理パスの話ですよ。
BluOxy

2020/08/03 10:49 編集

Q&Aのコミュニケーションでは、至急性がある訳ではないので、余程日時が開かない限りは急く必要はありません。謝る必要もありません。明日でも構わないですから、ゆっくり考えた上でかつメンタルの強い状態でコメントには可能な限り対応をお願いします。
syugaaburesu

2020/08/03 10:54

物理パスというのは対象のファイルが存在してる場所ではないのですか?今回 @"{0}{1}{2}", _currentPath,RELATIVE_PATH,file.FileName);file.SaveAs(filePath); 上記コードで保存場所のパスを作ってsaveasで保存しているのですがそれとは別の話でしょうか。すみません
退会済みユーザー

退会済みユーザー

2020/08/03 11:16 編集

デバッガでブレークポイントを以下の行の下に設定して、 var filePath = string.Format(@"{0}{1}{2}", _currentPath, RELATIVE_PATH, file.FileName); そこで止めて、filePath がどうなっているか書いてください。
syugaaburesu

2020/08/04 00:23

"C:\\Proxy\\Server\\Server\\../../Client/Manage/txt/test1.txt" が返ってきました
退会済みユーザー

退会済みユーザー

2020/08/04 00:40

../../ というのは URL の相対パスの一部なのですが、そういうのが混ざっていても物理パスとして有効なのですか? そういうのは初めて見ました。そのフォルダはどこにあるのか把握できてますか? 何故ここにこだわっているかと言うと、file.SaveAs(filePath); の filePath の物理パス C:\Proxy\Server\Server\../../Client/Manage/txt/test1.txt が、$("#test1").load(root + test1); の URL https://192.168.100.204/client/manage/txt/test1.txt が該当するサーバー上の物理パスと違うとすると、話が始まらないからです。
syugaaburesu

2020/08/04 00:45

はい、どこにあるかは把握できています。もしかしたらVM上でやっているかつ疑似サーバとして動かしているのが原因かもしれないです。 こうやって話しているときに申し訳ありませんが。ほかの方に助言をいただいて調べていたものを使ってみたら保存したファイルを全部UTF-8に書き換えることができましたので一応今回の問題は解決しました。
退会済みユーザー

退会済みユーザー

2020/08/04 00:50

質問者さん、ASP.NET Web Forms アプリの知識はあまりないようですね。 ASP.NET Web Forms アプリでは、アプリケーションルート化の URL(仮想パス)に該当するサーバーの物理パスの取得には HttpServerUtility.MapPath メソッドを使います。 また、ブラウザによっては HttpPstedFile.FileName はクライアント側でのフルパスになることがあるので Path.GetFileName を使うのが必須です。 そのあたりを見直してみてください。 ところで、ファイル名は const test1 = "test1.txt"; のようにハードコーディングされている一方、アップロードするファイル名はユーザーの任意になるはずで、それを file.FileName で取得して使うと違った名前になりませんか?
退会済みユーザー

退会済みユーザー

2020/08/04 00:54

> ほかの方に助言をいただいて調べていたものを使ってみたら保存したファイルを全部UTF-8に書き換えることができましたので一応今回の問題は解決しました。 その「ほかの方」というは質問に以下のように書いてあった「知人」ですか? > 知人に聞いたところサーバサイドでアップロードしたファイルを開いてUTF形式で保存すればライブラリを使わなくていいとの事でした。
退会済みユーザー

退会済みユーザー

2020/08/04 01:03

「ほかの方」=「知人」なら、そもそもここ Teratail で聞く必要はなくて最初から知人に相談するべきだったのでは? 自分としては無駄に時間を使わされたという感じですね。 問題解決でこれ以上 Q&A は必要ないということのようですので、 「ほかの方に助言をいただいて調べていたものを使ってみたら保存したファイルを全部UTF-8に書き換えることができました」というのを具体的にどのようにしたのか回答欄に書いて、このスレッドはクローズしてください。
syugaaburesu

2020/08/04 01:14

>質問者さん、ASP.NET Web Forms アプリの知識はあまりないようですね。 今回が初めて取り組んだものでおっしゃる通りあまり理解できておりません。 >ところで、ファイル名は const test1 = "test1.txt"; のようにハードコーディングされている一方、アップロードするファイル名はユーザーの任意になるはずで、それを file.FileName で取得して使うと違った名前になりませんか? アップロードする部分のaspxは参考したものが多いのでいまいち自分も理解できていないのですが恐らくjs上のformdataという所でどのテキストかを決めている?(言い方がおかしいかもしれません)なのでfile.fileNameが 既存のになってそこに上書きされるのかなと考えておりました >その「ほかの方」というは質問に以下のように書いてあった「知人」ですか? いえ、BluOxyさんです。アップロードされた全てのファイルはある特定の文字コードとして保存されるようにしましょう。というのがあったのでそちらを試してみたところすべてUTF-8で保存できましたので文字化けの心配は恐らく大丈夫だと思います。
syugaaburesu

2020/08/04 01:15

長時間大変申し訳ありません。自分としては多く学べることがあったのでとてもありがたいです。これから質問していくことがあったらなるべく明確にしていきます。ありがとうございました。
BluOxy

2020/08/04 02:18

おめでとうございます。私の回答で解決されたのであれば、それをBAに選んで質問のクローズをお願いします。 > これから質問していくことがあったらなるべく明確にしていきます。 teratailでは 質問するときのヒント が用意されているので参考にしてください。 https://teratail.com/help/question-tips
退会済みユーザー

退会済みユーザー

2020/08/04 03:13

> アップロードされた全てのファイルはある特定の文字コードとして保存されるようにしましょう。というのがあったのでそちらを試してみたところすべてUTF-8で保存できました それは具体的にどのようにしたのかを回答欄に書いて、このスレッドはクローズしてください。 ユーザーが勝手に Shift_JIS, UTF-8, UTF-16 BE, UTF-16 LE 等々の文字コードを使ってテキストファイルを作り、それらをアップしてくるような場合、どうやってアップロードされたファイルからその文字コードを判別してそれを UTF-8 に変換できるようにしたのか興味があります。是非教えてほしいです。
guest

回答3

0

ベストアンサー

テキストファイルを指定してサーバにアップロードします。更新すると選択したボタンと連動したテキストエリアにテキストの内容が表示されます
inputタグを使わずにファイルをブラウザへアップロードする方法

アップロード後、HTTPリクエストを送信しページが更新されるような仕様であれば、アップロードしたテキストファイルをASP.NET Web Forms側で読込み、Encoding.Convert メソッド 等で任意の文字コードにしたバイト配列をページに埋め込んでレスポンスとして返せば実現できます。

そうではなく、HTTPリクエストを送信しない仕様であり、かつどうしてもinputタグを使わないなら、私ならWebAPI サーバーを立てます。レスポンスに各文字コードを持ったバイト配列を何らかの形式(JSONなど)で返すようなPOSTメソッドを作って対処をするかもしれません。

アップロードしたテキストファイルをASP.NET Web Forms側で読込み

ASP.NET Web Formsでは下記のような機能があるようですから、使えるかもしれません。
[ASP.NET]ブラウザからファイルをアップロードできるようにするには?


再開されているようなので、追記します
※ただ、自分はWeb Formsはあまり詳しくありません。間違っている点はコメントで指摘をお願いします

拝見したコードでは、ASP.NET WebFormsにファイルをアップロードする処理は書かれていますが、ダウンロードする処理は実装されていないように見えます。なので、まずはその実装を行えば良いかと思います。

実装で気になる点

javascript

1 $.ajax({ 2 url : HOST + "/Server/Server/info_uploader.aspx", 3 type : "POST", 4 data : formData, 5 cache : false, 6 contentType : false, 7 processData : false, 8 dataType : "html", 9 async: false 10 }) 11 .done(function(){ 12 document.getElementById("upload").innerHTML = "test1をアップロードしました"; 13 });

アップロード後、HTTPリクエストを送っているのではなく、HTML要素(upload)をただ書き換えています。このdoneメソッドのコールバックに、何も実装されていません。

なので、ここに何を実装したいのかがポイントだと思っています。
(HTML要素を書き換えて文字コードの表示する? もしくはページ遷移してからそのページで文字コードの表示をする?)

コメントで

アップロード後、ページが更新されるのでしょうか(HTTPリクエストが送信されるのか)。

もしくはHTML要素が書き換わるだけでしょうか。

に対して

前者です。POSTで送信します

と答えて頂きました。
ページ遷移が伴っても良いのであれば [ ASP.NET ] ページ遷移と動作シーケンス ( Server.Transfer / Response.Redirect ) の通りに実装すれば良いです。その後、遷移先のページでダウンロードしたテキストファイルを適切なエンコーディングを行い、表示する実装を作成する必要があります。

$("#test1").load(root + test1);やら$("#test1").load(root + test2); を done メソッドのコールバックで呼び出したら解決しませんか。しかし、ベストな方法かはわかりません

具体的には、下記のようなノリです。
※動くかも分からないし、正しいかもわかりませんが .load(root + test1) でファイルの中身が取れる前提でのコードです

diff

1 $.ajax({ 2 url : HOST + "/Server/Server/info_uploader.aspx", 3 type : "POST", 4 data : formData, 5 cache : false, 6 contentType : false, 7 processData : false, 8 dataType : "html", 9 async: false 10 }) 11 .done(function(){ 12+ $("#test1").load(root + test1); 13 document.getElementById("upload").innerHTML = "test1をアップロードしました"; 14 });

また、余談ですが、onClickDummyButton1onClickDummyButton2onClickDummyButton3は1つの関数にまとめられます。メソッドや変数の名前に連番をつけることはアンチパターンとして有名なので、調べてみると別の意味で幸せになれるかもしれません。

投稿2020/08/03 05:11

編集2020/08/04 02:20
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syugaaburesu

2020/08/03 05:14

すみません。ありがとうございます
syugaaburesu

2020/08/03 07:37

すみません。前者と答えていましたが違うかもしれません。現状ファイルをアップロードしても変わりません。再ロードすると変わります。ただ再ロードした時に文字コードがおかしいと文字化けされたものが表示されてしまいます。答えになっているか分かりませんがお願いします
syugaaburesu

2020/08/03 07:40

doneメソッド自体あまり理解できてなくてサーバにアップロードできたら行われるメソッドで大丈夫ですよね?なのでそこに文字コードを変える処理等追加すれば良いのでしようか?それともアップロードする前に統一とか出来たりするのでしょうか
syugaaburesu

2020/08/03 07:42 編集

続けてコメントごめんなさい。dummybuttonメソッドを複数作ったのは自分でも反省しております。ご指摘頂きありがとうございますm(_ _)m統一できるようにしたいと思います
BluOxy

2020/08/03 07:45

> doneメソッド自体あまり理解できてなくてサーバにアップロードできたら行われるメソッドで大丈夫ですよね? http://js.studio-kingdom.com/jquery/ajax/ajax の > 下記は、サーバにユーザー情報をPOST送信し、通信完了時にアラートダイアログを表示する例になります。 を見る限りそうみたいですよ。
BluOxy

2020/08/03 08:48 編集

$("#test1").load(root + test1);やら$("#test1").load(root + test2); を done メソッドのコールバックで呼び出したら解決しませんか。しかし、ベストな方法かはわかりません
syugaaburesu

2020/08/03 09:16

試して見ましたがだめです。テキストファイルがUTFではないのでそれを変更しないといけないのかなと思いますいつロードしても文字コードは変わらないので..だと思います。すみません。
BluOxy

2020/08/03 09:19

どう駄目だったんでしょうか。値は取れたのでしょうか。取れないなら何かエラーが出たのでしょうか。
syugaaburesu

2020/08/03 09:21

値は取れていますが文字化けしています。
BluOxy

2020/08/03 09:42 編集

色々なエンコーディングのテキストを読む時点でエンコードの判定をした方が良いと思います。 info_uploader.Page_Loadメソッド内でそのファイルのエンコードを判定し、文字化けしない特定の文字コードに変換して、アップロードされた全てのファイルはある特定の文字コードとして保存されるようにしましょう。 そうすればページに表示する際は単にそのファイルを読む込むだけで良くなります。
syugaaburesu

2020/08/03 09:48

わかりました。明日やってみます
退会済みユーザー

退会済みユーザー

2020/08/04 07:51

> わかりました。明日やってみます 質問のコメント欄でもお願いしましたが、具体的にどのように実装したのかを書いください。 ユーザーが勝手に Shift_JIS, UTF-8, UTF-16 BE, UTF-16 LE 等々の文字コードを使ってテキストファイルを作り、それらをアップしてくるような場合、どうやってアップロードされたファイルからその文字コードを判別してそれを UTF-8 に変換できるようにしたのか興味があります。是非教えてほしいです。
guest

0

もっといい手はあるかもしれませんし手間がかかってしまいますが現状としての問題は解決しましたのでご報告いたします
・file.SaveAs(filePath);を行った後にifとfor文を使い疑似特定を行う,文字化けがなくなり次第UTF-8に上書き保存する。

説明いたします。

C#

1string text = System.IO.File.ReadAllText(filePath, Encoding.GetEncoding("UTF-8")); 2 char[] chars = text.ToCharArray(); 3 string[] strings = new string[text.Length]; 4 for (int i = 0; i < text.Length; i++) strings[i] = text.Substring(i, 1);

上記は一度保存したテキストファイルを配列の中に一文字ずつ入れています。
今回行数等決めていませんがある程度行を入力する過程で進めると恐らく文字化け特有の�や◇が出没すると考えたので
ifで�や◇があるかないか、なければほとんどの確率でUTF-8なのでスルーして処理を終わります。あった場合
Encoding.GetEncoding("")で何らかの文字コードを入力(下記はShift_JISにしています)文字コードを変更して上書き保存します。

C#

1StreamReader sr = new StreamReader(filePath, Encoding.GetEncoding("Shift_JIS")); 2string s = sr.ReadToEnd(); 3sr.Close(); 4//UTF-8で書き込む、上書きする 5System.IO.StreamWriter sw = new System.IO.StreamWriter(filePath,false,System.Text.Encoding.GetEncoding("UTF-8")); 6sw.Write(s); 7sw.Close();

これらをfor文で囲って文字化けが出なくなるまで続けます。今回SJIS,EUC,UTF-16で試しましたが問題ありませんでした。
とても非効率なためおすすめできないかもしれません

これを完璧な文字コード変換とはいいがたいですが今回はこちらで終わらせようと思います。
皆様に色々とご迷惑をおかけして申し訳ありません。時間があった時には完璧な変換をできるようしていきたいなと思います。
今回はありがとうございました。

投稿2020/08/04 08:32

syugaaburesu

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BluOxy

2020/08/04 12:33 編集

あまり精査していませんし、もしかすると間違った情報が含まれているかもしれませんが、解決策を書いて頂いてありがとうございます。 ただ、対価を得ている訳でもなくあくまでユーザーは任意で回答しているだけなので、謝罪を入れなくても良いです。(私の場合、頻繁に謝罪されるとむしろ気を使うので、そっちの方が嫌です) それよりも指摘されたことをまっすぐ対応してくれる人の方が好感が持てますから、そちらを意識して頂ければと思います。(これも主観的な意見ではありますが、私と同じような意思を持つユーザーが多数派と思います)
syugaaburesu

2020/08/04 23:56

分かりました!今回はありがとうございます!!
guest

0

一旦こちらの質問は終わらせときたいと思います。
先程まで親切に教えていただいた皆様の貴重な時間を使わせてしまい大変申し訳ありません。一度理解の見直しをして分かってから質問したいと思いますm(_ _)m

投稿2020/08/03 04:53

syugaaburesu

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/03 05:10 編集

> 一度理解の見直しをして分かってから質問したいと思います ということは、依然として、このスレッドの課題(アップロードしたテキストファイルをブラウザに表示する)は解決はする必要があって、ギブアップしてもう全く Q&A をやる必要がなくなったというわけではないですよね? であれば、このスレッドで Q&A を続けるようにしてください。
syugaaburesu

2020/08/03 05:18

先程のお返しであった通り話が通じていない時点でこれ以上時間を費やしてもらうのは申し訳ないと判断致しました。続けるにしても自分が理解出来ていなきゃ意味が無いので一旦閉めたいと思います。申し訳ありません
退会済みユーザー

退会済みユーザー

2020/08/03 05:40 編集

> 話が通じていない時点でこれ以上時間を費やしてもらうのは申し訳ないと判断 いえいえ、逆です。 コメント欄でやり取りして何がしたいのかがやっと明らかになったのに、止めてしまったらコメントした二人の時間と労力は無駄になってしまいます。それだけでなく、このスレッドを見て回答を考えてくれた閲覧者の方もおられるはずで、その方たちの時間と労力も無駄になってしまいます。BluOxy さんも回答されてますし、その方向で考えてみて、Q&A を続けるようにしてはいかがですか?
syugaaburesu

2020/08/03 07:26

わかりました。頑張ってみようと思います
退会済みユーザー

退会済みユーザー

2020/08/03 08:35 編集

追記されたコードを拝見しました。質問者さんが書いたのですか? もし、誰か他の人が書いたコードに手を加えているということなら、書いた人に質問した方が良いと思うのですが、とりあえずそれは置いといて・・・  > 下記コードはファイルをアップロードして表示することは出来ます。 どのタイミングでどこにどのようにして表示しているのですか? 表示するためのコードが見当たりませんが、どれですか? アップロードされたテキストファイルは file.SaveAs(filePath); で物理パス filePath に保存しているのですよね? それがホントにできているかかなり疑問です。間違いなく保存できているのですか? そして、表示というのは具体的にどうやっているのですか? 最初の話では、ASP.NET の C# のコードで物理パス filePath からテキストファイルを読みだしてきて、ページのテキストエリアに表示するという話だったと理解していますが、そのためのコードが見当たりません。 テキストエリアというのは多分 <div class="usertext" id="test1~3" ... のことではないかと思っていますが、どのタイミングでどのようにして書き込んでいるのですか? 物理パス filePath からテキストファイルを読みだして来るというわけではなくて、直接 HttpPostedFile からファイルの中身を読んできて、それをページのテキストエリアに表示するという話なのですか? そうだとしてもそのコードは見当たりませんが、どこにあるのですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問