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

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

新規登録して質問してみよう
ただいま回答率
85.36%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

1回答

921閲覧

C#でzipファイルの作り方がわからない

moshi

総合スコア90

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/06/03 07:45

編集2020/06/03 10:05

前提・実現したいこと

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#側のファイルの作りかたの問題でしょうか?

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

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

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

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

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

m.ts10806

2020/06/03 07:48

まずはSpring側で確実にファイルを作るところからでは? 呼び出す方だけ記述されてもこちらではその正当性は判断できませんし、SpringやJavaのタグを追加しコードも追記された方が問題切り分けもできるのでは
moshi

2020/06/03 08:18

ご指摘ありがとうございます。 タグの追加とソースコードの追記をしてみました。
guest

回答1

0

まずはZIPにしないで、普通にファイルとして保存してみればどうですか?
それが確実にできるとなってから考えればいいんでは

投稿2020/06/03 07:59

y_waiwai

総合スコア88026

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

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

moshi

2020/06/03 08:19

ご回答ありがとうございます。 ZIPファイル以外でテキストファイル、jpgファイルで試してみました。 テキストファイルは問題なく作成できました。 画像ファイルのほうはサイズはある(0byteではない)のですが、開くことができませんでした。 Springbootのほうが良くないのかもしれません。
y_waiwai

2020/06/03 08:22

そうやって、問題はどこにあるのかをはっきりさせないと解決できませんね
moshi

2020/06/03 08:48

Springbootアプリケーションで返すレスポンスが間違っていたのか、C#アプリケーションのほうのファイルの作り方がおかしいのかを振り分ける方法はあったりしますでしょうか? 作成できるファイルの種類に差があることはわかったのですが、 ①Springbootのレスポンスが間違っているためC#側のファイル作成部分は正しいがファイルが作成できない ②Springbootのレスポンスは正しいが、C#側がテキストファイル以外を作成する形になっていない の振り分けができなくて…
y_waiwai

2020/06/03 08:54

クライアント・サーバ側でそれぞれ送った(つもりの)ファイル、受けた(つもりの)ファイルを保存させて、それぞれが同一か見てみるとか。。 #サーバ側がどうなってるのかわからんのでピント外れかも
len_souko

2020/06/03 09:30

ちょっとjavaは詳しくないんで的外れかもしれませんが、ググってみたところ以下の情報がありました http://kobaken.hatenadiary.com/entry/2016/01/21/184409 の「ファイルをDLする!」のところ > // レスポンスに値をセット > responce.setContentType("application/octet-stream;charset=shift_jis"); > responce.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileNamePrefix + ".zip", "UTF-8")); > responce.setHeader("Content-Transfer-Encoding", "binary"); ひょっとして最後のがないからバイナリとしてクライアントに返してないのでは? なのでテキストファイルだけデータが壊れていないのかも?
moshi

2020/06/03 10:01

>len_soukoさん ご回答ありがとうございます。 responce.setHeader("Content-Transfer-Encoding", "binary");も入れてみましたがうまくいきませんでした…
Daregada

2020/06/03 16:06

> responce.setHeader("Content-Transfer-Encoding", "binary");も入れてみましたがうまくいきませんでした… まさかこのまま入れたわけではないですよね?
moshi

2020/06/04 00:49 編集

>Daregadaさん ご回答ありがとうございます。 Content-Transfer-Encodingというパラメータにbinaryを設定するのかと思いこのまま入れてしまいました… Content-Transfer-Encodingかbinaryが可変のものということでしょうか?
Daregada

2020/06/04 01:42

いや、responceではなくて、あなたのコードだと(引数の名前が)resですよね、という話です。
moshi

2020/06/04 02:55

resには変更しています!
Daregada

2020/06/04 03:53

それがなぜ「responce.setHeader("Content-Transfer-Encoding", "binary");も入れてみましたがうまくいきませんでした…」という説明になるのか、という点が突っ込まれています。不正確な報告では、あやふやな回答しか得られませんよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問