1

春を使ってREST Webサービスを書いています。応答でファイルを返す必要があります。

これは GET 呼び出しであり、ユーザーが URL を入力すると、ブラウザーにダウンロード セクションが表示されます。

コントローラーの戻り値の型がどうあるべきかわかりません。コード内のコンテンツ タイプを指定する必要はありますか?

4

3 に答える 3

4

私のプロジェクトでも同様の要件がありました。以下のコードを使用しました

@Controller
@RequestMapping("/reports")
public class ReportsController {

    protected static String PRODUCTIVITY_REPORT_FILE = "productivityReportFile";

    @Resource(name="propertyMap")
    protected Map<String, String> propertyMap;

    @RequestMapping(value="/cratl/productivity_report", method=RequestMethod.GET, produces="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    public @ResponseBody byte[] getProductivityReport()
            throws Exception {
        byte[] reportBytes = null;
        try {
            File reportFile = new File(propertyMap.get(PRODUCTIVITY_REPORT_FILE));
            if (reportFile != null && reportFile.exists()) {
                InputStream reportInputStream = new FileInputStream(reportFile);
                long length = reportFile.length();
                reportBytes = new byte[(int)length];
                int offset = 0;
                int numRead = 0;
                while (offset < reportBytes.length
                       && (numRead = reportInputStream.read(reportBytes, offset, reportBytes.length-offset)) >= 0) {
                    offset += numRead;
                }
                if (offset < reportBytes.length) {
                    throw new Exception("Could not completely read file "+ reportFile.getName());
                }
                reportInputStream.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return reportBytes;
    }

お役に立てば幸いです

于 2012-08-31T18:52:50.237 に答える
0

以下のコードを使用しました

    FileInputStream inputStream = new FileInputStream("FileInputStreamDemo.java");  //read the file

    response.setHeader("Content-Disposition","attachment; filename=test.txt");
    try {
        int c;
        while ((c = inputStream.read()) != -1) {
        response.getWriter().write(c);
        }
    } finally {
        if (inputStream != null) 
            inputStream.close();
            response.getWriter().close();
    }

これは別のスレッドで見つかりました

サーバーにファイルを保存せずにサーバーの応答にファイルオブジェクトを書き込む方法は?

于 2012-08-31T18:13:55.080 に答える
0

任意の名前を付けることができるコントローラー メソッドは、読み込みたいビュー (この場合はダウンロード セクション) に対して定義されている views.xml で定義されている URL 名を持つ文字列を返します。したがって、コントローラーは次のようになります。

@Controller
public class MyController {

    @RequestMapping(value = "/downloads", method = RequestMethod.GET)
    public String getDownloadSection() {
        System.out.println("getting downloads");
        return "downloads/index";
    }
}

views.xml には次のタグが含まれている必要があります。

<definition extends="default" name="downloads/index">
<put-attribute name="body" value="/WEB-INF/views/downloads/index.jspx"/>
</definition>

extends="default"は、layouts.xml にあるタイル定義です。

それくらいだと思います。//yoursite/downloads に対して GET リクエストを実行すると、メッセージが出力されます。

それはあなたの質問に答えるはずです:)

于 2012-08-31T01:14:13.273 に答える