我正在使用 spring 编写一个 REST 网络服务。我必须在响应中返回一个文件。
它是一个 GET 调用,当用户输入 URL 时,应该在浏览器中向用户显示下载部分。
我不确定控制器中的返回类型应该是什么。我必须指定任何内容类型 i 代码吗?
我的项目中有类似的要求。我使用了下面的代码
@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;
}
希望对你有帮助
您的控制器方法(可以具有您想要的任何名称)返回一个带有 url 名称的字符串,该名称在为您要加载的视图(在本例中为下载部分)定义的 views.xml 中定义。所以你的控制器看起来像这样:
@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"是一个 tile 定义,应该在你的 layouts.xml 中
我想就是这样。如果您向 //yoursite/downloads 发出 GET 请求,它应该会打印该消息。
我希望那应该回答你的问题:)
我使用了下面的代码
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();
}
这是在另一个线程中找到的