我有一个要求,我从数据库中获取字节数组(byte [])数据,我需要将这些数据保存在文件中,并允许用户保存他想要保存的位置,就像下载附件一样。我正在从数据库中检索文件名和扩展名。我正在使用java,spring-mvc。 以下是代码:
弹簧控制器:
@RequestMapping(value="/getFile", method = RequestMethod.GET)
public ModelAndView getFile(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mav = new ModelAndView();
//logic to get the data from database
byte[] documentData = document.getDOCUMENTData();
String documentName = document.getDOCUMENTTITLE();
String documentExt = document.getDocumentExtension();
}
请建议,我知道使用java.io. *,我可以在文件中写入byte []数据并通过获取上面声明的值来给出文件名和扩展名,但是如何在点击“下载”时允许用户文件“用于写入数据的图标,并将该文件保存在他想要的相同位置下载附件。请建议。一旦用户点击下载文件图标控件来到上面的控制器。谢谢。
- EDIT-- 修改后的代码:
@RequestMapping(value="/getFile", method = RequestMethod.GET)
public ModelAndView getFile(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mav = new ModelAndView();
//logic to get the data from database
byte[] documentData = document.getDOCUMENTData();
String documentName = document.getDOCUMENTTITLE();
String documentExt = document.getDocumentExtension();
response.setHeader("Content-Disposition", "attachment;filename="+userDoc.getDOCUMENT_TITLE());
long l = userDoc.getDOCUMENT_SIZE();
int size = (int)l;
response.setContentLength(size);
response.getWriter().write("hello");//i need to write byte[] but for test i kept string.
}
我希望用户看到保存窗口,以便他可以保存他想要的任何地方从邮件下载附件。谢谢。
答案 0 :(得分:0)
这是我用于同一请求的代码
HTML页面
<h:commandButton value="Click Here to Download" action="#{reportBean.download}" />
<强> BEAN:强>
public void download(){
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
response.setHeader("Content-Disposition", "attachment;filename="+file.getName());
response.setContentLength((int) file.length());
ServletOutputStream out = null;
try {
FileInputStream input = new FileInputStream(file);
byte[] buffer = new byte[1024];
out = response.getOutputStream();
int i = 0;
while ((i = input.read(buffer)) != -1) {
out.write(buffer);
out.flush();
}
FacesContext.getCurrentInstance().getResponseComplete();
input.close();
} catch (IOException err) {
err.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException err) {
err.printStackTrace();
}
}
}
确保您拥有名为file
的File对象答案 1 :(得分:-1)
您有两种方法可以实现这一目标:
一种方法是将文件写入服务器的本地文件系统中的Internet可访问文件夹中。您可以在Apache / IIS serttings中配置可从Internet访问哪些服务器的本地文件夹。然后,您更新HTML,以便“下载文件”链接通过URL指向该文件。
另一个选项是,像@ an3sarmiento一样,将文件作为byte []流返回给浏览器。要使此选项起作用,您必须与文件内容一起发送响应标头,在该响应标头中,您告诉浏览器您将可下载的文件作为流返回。您可以使用以下行:
response.setHeader("Content-Disposition", "attachment;filename="+[your file name]);
response.setContentLength([your file's length or bytes count]);
response.getWriter.write([your file's content as byte array]);
在上面的行中,我假设您正在使用Java Servlets,并且您有一个名为HttpServletResponse
的{{1}}变量,您将响应浏览器的HTTP POST或GET请求。