0

ユーザーがファイルをダウンロードできるサーブレットを開発しようとしましたが、ユーザーはファイルをダウンロードできますが、ファイルの内容にはバイナリガベージが含まれており、人間が読める形式ではありません。何が理由なのかわかりますか?

コード

int length = -1, index = 0;
        byte[] buffer = null;
        String attachmentPath = null, contentType = null, extension = null; 
        File attachmentFile = null;
        BufferedInputStream input = null;
        ServletOutputStream output = null;
        ServletContext context = null;

        attachmentPath = request.getParameter("attachmentPath");
        if (attachmentPath != null && !attachmentPath.isEmpty()) {
            attachmentFile = new File(attachmentPath);

            if (attachmentFile.exists()) {
                response.reset();

                context = super.getContext();  
                contentType = context.getMimeType(attachmentFile.getName());       
                response.setContentType(contentType);

                response.addHeader("content-length", String.valueOf(attachmentFile.length()));  
                response.addHeader("content-disposition", "attachment;filename=" + attachmentFile.getName());

                try {
                    buffer = new byte[AttachmentTask.DEFAULT_BUFFER_SIZE];
                    input = new BufferedInputStream(new FileInputStream(attachmentFile));
                    output = response.getOutputStream();

                    while ((length = input.read(buffer)) != -1) {
                        output.write(buffer, 0, length);
                        index += length;

//                      output.write(length);
                    }

                    output.flush();

                    input.close();
                    output.close();

                } catch (FileNotFoundException exp) {
                    logger.error(exp.getMessage());
                } catch (IOException exp) {
                    logger.error(exp.getMessage());
                }


            } else {
                try {
                    response.sendError(HttpServletResponse.SC_NOT_FOUND);
                } catch (IOException exp) {
                    logger.error(exp.getMessage());
                }
            }

バイナリまたはテキストモードまたはブラウザ設定としてファイルを書き込むことに関連していますか?

助けてください。

ありがとう。

4

1 に答える 1

0

問題はこれまでに与えられたコードにはありません。/の代わりにInputStream/を適切に使用してファイルをストリーミングしています。OutputStreamReaderWriter

問題の原因は、ファイルの作成/保存方法にある可能性が高くなります。この問題は、読み取り/書き込み中の文字に適切な文字エンコードを使用するように指示されていない、Readerおよび/またはを使用した場合に発生します。Writerおそらく、アップロード/ダウンロードサービスを作成していて、アップロードプロセス自体に問題がありましたか?

データがUTF-8であると仮定すると、次のようにリーダーを作成する必要があります。

Reader reader = new InputStreamReader(new FileInputStream(file), "UTF-8"));

そして作家は次のように:

Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));

ただし、実際には文字ごとにストリームを操作する必要はなく、データを変更せずに転送したいだけの場合は、実際には常にInputStream/を使用する必要がありますOutputStream

参照:

于 2012-12-20T12:23:20.827 に答える