HttpServletResponse(web的文件下载/文件长传)

web服务器对每个客户端请求,创建对应的HttpServletRequest,和HttpServletResponse对象

  • 如果要获取客户端的参数:HttpServletRequest
  • 给客户端相应一些信息:HttpServletResponse

负责向浏览器发送数据:

ServletOutputStream getOutputStream() throws IOException; PrintWriter getWriter() throws IOException; 

负责向浏览器发送响应头:

 void sendError(int var1, String var2) throws IOException; void sendError(int var1) throws IOException; void sendRedirect(String var1) throws IOException; void setDateHeader(String var1, long var2); void addDateHeader(String var1, long var2); void setHeader(String var1, String var2); void addHeader(String var1, String var2); void setIntHeader(String var1, int var2); void addIntHeader(String var1, int var2); void setStatus(int var1); 
  • 向浏览器输出消息
  • 下载文件
  • 文件上传

3-1文件下载步骤:

 1-获取下载路径 2-获取下载文件名 3-设置,需要浏览器能够支持我们下载的东西 4-获取下载文件的输入流 5-创建缓冲区buffer 6-获取OutputStream对象 7-将FileOutputStream流写入到buffer中 8-使用OutputStream,将缓冲区的数据,输入到客户端 

Java代码:

public class FileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1-获取下载路径 String realPath = "D:\\Project\\java\\javaweb-02-servlet\\response\\target\\classes\\西安电子科技大学.png"; System.out.printf("下载的路径是:"+realPath); // 2-获取下载文件名 String fileName = realPath.substring(realPath.lastIndexOf("\\")+1); // String fileName = realPath // 3-核心设置,需要浏览器能够支持我们下载的东西("Content-Disposition") // 文件名是中文:需要设置编码:URLEncoder.encode(fileName,"utf-8")) System.out.println("\n文件名:"+fileName); resp.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName,"utf-8")); // 4-获取下载文件的输入流 FileInputStream in = new FileInputStream(realPath); // 5-创建缓冲区buffer int len = 0; byte[] buffer = new byte[1024]; // 6-获取OutputStream对象 ServletOutputStream out = resp.getOutputStream(); // 7-将FileOutputStream流写入到buffer中,使用OutputStream,将缓冲区的数据,输入到客户端 while((len = in.read(buffer))>0){ out.write(buffer,0,len); } in.close(); out.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); // String } } 

文件下载专用,MVC注解写死

@RequestMapping(value="/download") public String downloads(HttpServletResponse response ,HttpServletRequest request) throws Exception{ //要下载的图片地址(文件也一样),只需要修改"/upload"以及fileName,其他不用动 String path = request.getServletContext().getRealPath("/upload"); String fileName = "西安电子科技大学_计算机技术.jpg"; //1、设置response 响应头 response.reset(); //设置页面不缓存,清空buffer response.setCharacterEncoding("UTF-8"); //字符编码 response.setContentType("multipart/form-data"); //二进制传输数据 //设置响应头 response.setHeader("Content-Disposition", "attachment;fileName="+URLEncoder.encode(fileName, "UTF-8")); File file = new File(path,fileName); //2、 读取文件--输入流 InputStream input=new FileInputStream(file); //3、 写出文件--输出流 OutputStream out = response.getOutputStream(); byte[] buff =new byte[1024]; int index=0; //4、执行 写出操作 while((index= input.read(buff))!= -1){ out.write(buff, 0, index); out.flush(); } out.close(); input.close(); return null; } 

文件上传:

  • 1-导入文件上传的jar包,commons-fileupload , Maven会自动帮我们导入他的依赖包 commons-io包;
<!--文件上传--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> <!--servlet-api导入高版本的--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> 
  • 2-配置bean:multipartResolver

注意!!!这个bena的id必须为:multipartResolver , 否则上传文件会报400的错误!在这里栽过坑,教训!】****

<!--文件上传配置--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 --> <property name="defaultEncoding" value="utf-8"/> <!-- 上传文件大小上限,单位为字节(10485760=10M) --> <property name="maxUploadSize" value="10485760"/> <property name="maxInMemorySize" value="40960"/> </bean> 
  • 3-编写前端
<form action="/upload" enctype="multipart/form-data" method="post"> <input type="file" name="file"/> <input type="submit" value="upload"> </form> 
  • 4-Controller
package nuc.ss.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.commons.CommonsMultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; @RestController public class FileController { //@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象 //批量上传CommonsMultipartFile则为数组即可 @RequestMapping("/upload") public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException { //获取文件名 : file.getOriginalFilename(); String uploadFileName = file.getOriginalFilename(); //如果文件名为空,直接回到首页! if ("".equals(uploadFileName)){ return "redirect:/index.jsp"; } System.out.println("上传文件名 : "+uploadFileName); //上传路径保存设置 String path = request.getServletContext().getRealPath("/upload"); //如果路径不存在,创建一个 File realPath = new File(path); if (!realPath.exists()){ realPath.mkdir(); } System.out.println("上传文件保存地址:"+realPath); InputStream is = file.getInputStream(); //文件输入流 OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); //文件输出流 //读取写出 int len=0; byte[] buffer = new byte[1024]; while ((len=is.read(buffer))!=-1){ os.write(buffer,0,len); os.flush(); } os.close(); is.close(); return "redirect:/index.jsp"; } } 

验证怎么来?

  • 前端实现
  • 后端实验,需要用到java的图片类,生产一个图片
    非重点,这里在前端写

原文链接:https://www.cnblogs.com/tqming/p/16531631.html

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/33409

(0)
上一篇 2024年7月24日
下一篇 2024年7月24日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml