1

次のように、Apache fileupload API を使用して (さまざまなコンテンツ タイプの) ファイルをアップロードしています。

FileItemFactory factory = getFileItemFactory(request.getContentLength());
ServletFileUpload uploader = new ServletFileUpload(factory);
uploader.setSizeMax(maxSize);
uploader.setProgressListener(listener);

List<FileItem> uploadedItems = uploader.parseRequest(request);

... 次の方法を使用してファイルを GridFS に保存します。

public String saveFile(InputStream is, String contentType) throws UnknownHostException, MongoException {
    GridFSInputFile in = getFileService().createFile(is);
    in.setContentType(contentType);
    in.save();
    ObjectId key = (ObjectId) in.getId();
    return key.toStringMongod();
}

... 次のように saveFile() を呼び出します。

saveFile(fileItem.getInputStream(), fileItem.getContentType())

次の方法を使用してGridFSから読み取ります。

public void writeFileTo(String key, HttpServletResponse resp) throws IOException {
    GridFSDBFile out = getFileService().findOne(new ObjectId(key));
    if (out == null) {
        throw new FileNotFoundException(key);
    }
    resp.setContentType(out.getContentType());
    out.writeTo(resp.getOutputStream());
}

ファイルをダウンロードするための私のサーブレット コード:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String uri = req.getRequestURI();

    String[] uriParts = uri.split("/");  // expecting "/content/[key]"

    // third part should be the key
    if (uriParts.length == 3) {
        try {
            resp.setDateHeader("Expires", System.currentTimeMillis() + (CACHE_AGE * 1000L));
            resp.setHeader("Cache-Control", "max-age=" + CACHE_AGE);
            resp.setCharacterEncoding("UTF-8");

            fileStorageService.writeFileTo(uriParts[2], resp);
        }
        catch (FileNotFoundException fnfe) {
            resp.sendError(HttpServletResponse.SC_NOT_FOUND);
        }
        catch (IOException ioe) {
            resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }
    else {
        resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
    }
}

でも; すべての非 ASCII 文字は「?」として表示されます。以下を使用してエンコーディングが UTF-8 に設定された Web ページで:

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

どんな助けでも大歓迎です!

4

2 に答える 2

1

お時間を頂戴して申し訳ありません!これは私の間違いでした。コードまたは GridFS に問題はありません。テスト ファイルのエンコーディングが間違っていました。

于 2013-02-27T09:23:12.690 に答える
0
resp.setContentType("text/html; charset=UTF-8");

理由: バイナリ InputStream と共にコンテンツ タイプのみが渡されます。

public void writeFileTo(String key, HttpServletResponse resp) throws IOException {
    GridFSDBFile out = getFileService().findOne(new ObjectId(key));
    if (out == null) {
        throw new FileNotFoundException(key);
    }
    resp.setContentType(out.getContentType()); // This might be a conflict
    out.writeTo(resp.getOutputStream());

}

于 2013-02-27T08:56:41.740 に答える