前提・実現したいこと
C#で作成したローカルアプリケーションでファイル名を指定してボタンを押した際に、サーバー側のSpringbootアプリケーションを呼び出して、サーバー(/opt/test)にあるzipファイル(sample.zip)をローカルのディレクトリ(C:\testcopy)にコピーしたいです。
発生している問題・エラーメッセージ
Springboot側はレスポンスが返ってきているのですが、それでZIPファイルを作成しても
解凍したときに画像ファイルが2ファイル入っているはずなのに1ファイルしかなかったり、画像ファイルも開けなかったりと何かがおかしいようです。
そのため以下のファイルの作成の仕方が間違っていなかったらSpringbootのAPIが間違っていると思うので問題の切り分けのために質問をさせていただきました。
普通のファイルを作成するときと同じように作ってしまったのですが、何か別の方法があったりするのでしょうか?
該当のソースコード
string url = UploadLogic.GetUrl("/download"); var task = await SendRequestAsyncString(url, downPath); try { // ファイル作成 File.Create(newFile).Close(); using (var sw = new StreamWriter(@strNewFile, false, Encoding.GetEncoding("Shift_JIS"))) { sw.Write(task); } }
補足情報(FW/ツールのバージョンなど)
Windows
追記
以前、この機能を実現するためのSpringbootアプリケーションの処理として
「サーバ側はクライアント側からのzipファイルDLリクエストが来たら、当該のファイルをバイナリで読み込み、内容をそのままresponseのoutputStreamに突っ込みます。」
と、教えていただいたのでSpringboot側では以下のソースを作成しました。
@PostMapping("/download") public void zipDownload(@RequestBody String path, HttpServletResponse res) throws IOException { File file = new File(path); res.setContentLength((int) file.length()); res.setContentType("application/octet-stream;charset=Shift_JIS"); FileCopyUtils.copy(new FileInputStream(file), res.getOutputStream()); }
このレスポンスをtaskで受け取ってそれでファイルの作成をしました。
追記2(試してみたこと)
元のファイル(サーバー側)のファイルと出力したファイル(ローカル側)のファイルをバイナリを比較するツールで比較してみたところ、84%おなじだが別のファイルとみなされていました。
そこで出力結果をネットワークストリームではなくファイル(java.txt)に書きだしし、それをZIPにリネーム(java.zip)にしてみたところバイナリ的にも同じものになりました。
当然、解凍してもファイルの破損などもありませんでした。
そうするとやはりC#側のファイルの作りかたの問題でしょうか?