java upload and download by onetime

合集下载

java文件实现文件的上传和下载

java文件实现文件的上传和下载

java⽂件实现⽂件的上传和下载简介 ⽂件上传和下载是java web中常见的操作,⽂件上传主要是将⽂件通过IO流传放到服务器的某⼀个特定的⽂件夹下,⽽⽂件下载则是与⽂件上传相反,将⽂件从服务器的特定的⽂件夹下的⽂件通过IO流下载到本地。

对于⽂件上传,浏览器在上传的过程中是将⽂件以流的形式提交到服务器端的,如果直接使⽤Servlet获取上传⽂件的输⼊流然后再解析⾥⾯的请求参数是⽐较⿇烦,所以⼀般选择采⽤apache的开源⼯具common-fileupload这个⽂件上传组件。

这个common-fileupload上传组件的jar包可以去apache官⽹上⾯下载,也可以在struts的lib⽂件夹下⾯找到,struts上传的功能就是基于这个实现的。

common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。

· ⽂件上传 1、⽂件上传页⾯和消息提⽰页⾯ upload.jsp页⾯的代码如下:<%@ page language="java" pageEncoding="UTF-8"%><!DOCTYPE HTML><html><head><title>⽂件上传</title></head><body><form action="${pageContext.request.contextPath}/servlet/uploadHandleServlet2" enctype="multipart/form-data" method="post"上传⽤户:<input type 上传⽂件1:<input type="file" name="file1"><br/>上传⽂件2:<input type="file" name="file2"><br/><input type="submit" value="提交"></form></body></html>在⽂件上传的页⾯要⽤enctype="multipart/form-data" method="post"来表⽰进⾏⽂件上传。

Java中实现文件上传下载的三种解决方案(推荐)

Java中实现文件上传下载的三种解决方案(推荐)

Java中实现⽂件上传下载的三种解决⽅案(推荐)java⽂件上传与⽂件下载是程序开发中⽐较常见的功能,下⾯通过本⽂给⼤家介绍Java中实现⽂件上传下载的三种解决⽅案,具体详情如下所⽰;第⼀点:Java代码实现⽂件上传FormFile file=manform.getFile();String newfileName = null;String newpathname=null;String fileAddre="/numUp";try {InputStream stream = file.getInputStream();// 把⽂件读⼊String filePath = request.getRealPath(fileAddre);//取系统当前路径File file1 = new File(filePath);//添加了⾃动创建⽬录的功能((File) file1).mkdir();newfileName = System.currentTimeMillis()+ file.getFileName().substring(file.getFileName().lastIndexOf('.'));ByteArrayOutputStream baos = new ByteArrayOutputStream();OutputStream bos = new FileOutputStream(filePath + "/"+ newfileName);newpathname=filePath+"/"+newfileName;System.out.println(newpathname);// 建⽴⼀个上传⽂件的输出流System.out.println(filePath+"/"+file.getFileName());int bytesRead = 0;byte[] buffer = new byte[8192];while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {bos.write(buffer, 0, bytesRead);// 将⽂件写⼊服务器}bos.close();stream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}第⼆点:Jsp页⾯上实现⽂件上传package com.vogoal.util;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Hashtable;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;public class JspFileUpload {/** request对象 */private HttpServletRequest request = null;/** 上传⽂件的路径 */private String uploadPath = null;/** 每次读取得字节的⼤⼩ */private static int BUFSIZE = 1024 * 8;/** 存储参数的Hashtable */private Hashtable paramHt = new Hasptable();/** 存储上传的⽂件的⽂件名的ArrayList */private ArrayList updFileArr = new ArrayList();/*** 设定request对象。

java实现文件上传、下载、图片预览

java实现文件上传、下载、图片预览

java实现⽂件上传、下载、图⽚预览这篇⽂章主要介绍了java实现⽂件上传、下载、图⽚预览,⽂中通过⽰例代码介绍的⾮常详细,对⼤家的学习或者⼯作具有⼀定的参考学习价值,需要的朋友可以参考下多⽂件保存到本地:@ResponseBody@RequestMapping(value = "/uploadApp",produces = { "application/json;charset=UTF-8" },method= RequestMethod.POST)public String uploadApp( HttpServletRequest request,@RequestParam("file") MultipartFile[] file) throws IOException {try {if(file.length > 0) {String name = file[0].getOriginalFilename().split(";")[0];String fileUrlName = CommonEnum.FILEPATH+"/"+name;for (int i = 0; i < file.length; i++) {FileUtils.copyInputStreamToFile(file[i].getInputStream(), new File(fileUrlName, file[i].getOriginalFilename().split(";")[1]));}return "success";}else{return "null";}}catch (Exception e){e.printStackTrace();return "error";}}下载⽂件:@RequestMapping(value = "/download", method = RequestMethod.GET)@ResponseBodypublic void download(@RequestParam Map<String, Object> data, HttpServletRequest request,HttpServletResponse response) throws FileNotFoundException { String time = DateUtil.formatFromDate("yyyyMMddHHmmss", new Date());List<Map<String, Object>> urllist = companyService.findByIMG(data);String path = (String) urllist.get(0).get("imgurl");String docx = StringUtils.substringAfterLast(path, ".");String fileName = time+"."+docx; // ⽂件的默认保存名InputStream inStream = new FileInputStream(path);// ⽂件的存放路径response.reset();response.setContentType("bin");response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");byte[] b = new byte[100];int len;try {while ((len = inStream.read(b)) > 0)response.getOutputStream().write(b, 0, len);inStream.close();} catch (IOException e) {e.printStackTrace();}}/*** 读取图⽚*/@RequestMapping(value = "/iomoreimgcom", produces = {"application/json;charset=UTF-8" }, method = RequestMethod.GET)@ResponseBodypublic synchronized void iomoreimgcom(HttpServletRequest request, HttpServletResponse response) throws Exception {String url = request.getParameter("url");File file = new File(url);BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());response.setHeader("Content-Type", "image/jpeg");byte b[] = new byte[1024];int read;try {while ((read = bis.read(b)) != -1) {bos.write(b, 0, read);}//request.getRequestDispatcher("/components/hazard/yscchird.html").forward(request, response);} catch (Exception e) {// TODO: handle exception} finally {if (bos != null) {bos.close();}if (bis != null) {bis.close();}}}前端请求直接拼接图⽚路径即可。

java实现FTP文件上传与文件下载

java实现FTP文件上传与文件下载

java实现FTP⽂件上传与⽂件下载本⽂实例为⼤家分享了两种java实现FTP⽂件上传下载的⽅式,供⼤家参考,具体内容如下第⼀种⽅式:package com.cloudpower.util;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import .TelnetInputStream;import .TelnetOutputStream;import .ftp.FtpClient;/*** Java⾃带的API对FTP的操作* @Title:Ftp.java* @author: 周玲斌*/public class Ftp {/*** 本地⽂件名*/private String localfilename;/*** 远程⽂件名*/private String remotefilename;/*** FTP客户端*/private FtpClient ftpClient;/*** 服务器连接* @param ip 服务器IP* @param port 服务器端⼝* @param user ⽤户名* @param password 密码* @param path 服务器路径* @author 周玲斌* @date 2012-7-11*/public void connectServer(String ip, int port, String user,String password, String path) {try {/* ******连接服务器的两种⽅法*******///第⼀种⽅法// ftpClient = new FtpClient();// ftpClient.openServer(ip, port);//第⼆种⽅法ftpClient = new FtpClient(ip);ftpClient.login(user, password);// 设置成2进制传输ftpClient.binary();System.out.println("login success!");if (path.length() != 0){//把远程系统上的⽬录切换到参数path所指定的⽬录ftpClient.cd(path);}ftpClient.binary();} catch (IOException ex) {ex.printStackTrace();throw new RuntimeException(ex);}}/*** 关闭连接* @author 周玲斌* @date 2012-7-11*/public void closeConnect() {try {ftpClient.closeServer();System.out.println("disconnect success");} catch (IOException ex) {System.out.println("not disconnect");ex.printStackTrace();throw new RuntimeException(ex);}}/*** 上传⽂件* @param localFile 本地⽂件* @param remoteFile 远程⽂件* @author 周玲斌* @date 2012-7-11*/public void upload(String localFile, String remoteFile) {this.localfilename = localFile;this.remotefilename = remoteFile;TelnetOutputStream os = null;FileInputStream is = null;try {//将远程⽂件加⼊输出流中os = ftpClient.put(this.remotefilename);//获取本地⽂件的输⼊流File file_in = new File(this.localfilename);is = new FileInputStream(file_in);//创建⼀个缓冲区byte[] bytes = new byte[1024];int c;while ((c = is.read(bytes)) != -1) {os.write(bytes, 0, c);}System.out.println("upload success");} catch (IOException ex) {System.out.println("not upload");ex.printStackTrace();throw new RuntimeException(ex);} finally{try {if(is != null){is.close();}} catch (IOException e) {e.printStackTrace();} finally {try {if(os != null){os.close();}} catch (IOException e) {e.printStackTrace();}}}}/*** 下载⽂件* @param remoteFile 远程⽂件路径(服务器端)* @param localFile 本地⽂件路径(客户端)* @author 周玲斌* @date 2012-7-11*/public void download(String remoteFile, String localFile) {TelnetInputStream is = null;FileOutputStream os = null;try {//获取远程机器上的⽂件filename,借助TelnetInputStream把该⽂件传送到本地。

Java文件上传与文件下载实现方法详解

Java文件上传与文件下载实现方法详解

Java⽂件上传与⽂件下载实现⽅法详解本⽂实例讲述了Java⽂件上传与⽂件下载实现⽅法。

分享给⼤家供⼤家参考,具体如下:Java⽂件上传数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传。

⽂件上传是数据上传的⼀种特例,指客户端向服务器上传⽂件。

即将保存在客户端的⽂件上传⼀个副本到服务器,并保存在服务器中。

1、上传表单要求⽂件上传要求客户端提交特殊的请求——multipart请求,即包含多部分数据的请求。

必须将<form/>标签的enctype属性值设为“multipart/form-data”,enctype表⽰encodingType,及编码类型由于客户端上传⽂件的⼤⼩是不确定的,所以http协议规定,⽂件上传的数据要存放于请求正⽂中,不能出现在URL地址栏内。

也就是说,想要上传⽂件必须提交POST请求。

表单中要有<input type="file" />标签注意:multipart/form-data请求与普通请求不同2、下载⽂件上传jar包并查看官⽅⽂档选择Commons中的FileUpload项⽬,并下载jar包和源⽂件查看FileUpload的⼯作⽅式查看FileUpload项⽬的API3、使⽤第三⽅jar包上传⽂件public class RegisterServlet extends HttpServlet {private static final long serialVersionUID = 1L;public RegisterServlet() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.getWriter().append("Served at: ").append(request.getContextPath());}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//第⼀步、判断请求是否为multipart请求if(!ServletFileUpload.isMultipartContent(request)) {throw new RuntimeException("当前请求只⽀持⽂件上传");}try {//第⼆步、创建FileItem⼯⼚DiskFileItemFactory factory = new DiskFileItemFactory();//设置临时⽂件存储⽬录String path = this.getServletContext().getRealPath("/Temp");File temp = new File(path);factory.setRepository(temp);//单位:字节。

JAVAWEB实验上传和下载之欧阳美创编

JAVAWEB实验上传和下载之欧阳美创编

实验全过程记录一、实验目的:Html表单提交以及文件上传下载熟练运用Html表单提交以及文件上传下载二、实验内容:1、编写如下html表单,并编写servlet处理表单提交的请求,表单信息插入数据库2、如下表单,输入学号,点击“下载简历”按钮,实现下载该学生简历3、如下表单,输入最小最大值,点击提交按钮,导出符合条件的学生信息到文本文件(csv文件)中,或者导出到excel文件(使用POI框架)三、实验用设备仪器及材料:软件需求:Eclipse硬件需求:微型计算机四、实验方法及步骤:1.编写HTML页面(1)<form class="formhorizontal" action="submit.do" method="post" id="stuIdform"enctype="multipart/formdata"><div class="formgroup"id="messageId"><div class="colsm8"><input type="text" name="Id" value="${student['id']}"></div></div><div class="formgroup"><label for="inputEmail3" class="colsm4 controllabel">学号</label><div class="colsm8"><input type="text"class="formcontrol" id="inputstuId3"name="stuId"placeholder="学号"value="${student.stuId}"></div></div><div class="formgroup"><label for="inputPassword3" class="colsm4 controllabel">姓名</label><div class="colsm8"><input type="text"class="formcontrol" id="inputname3"name="name"placeholder="姓名" value="${}"></div></div><div class="formgroup"><label for="inputage3"class="colsm4 controllabel">密码</label><div class="colsm8"><input type="password" class="formcontrol" id="inputpassword3"name="password"placeholder="密码"value="${student.password}"></div></div><div class="formgroup"><label class="colsm4 controllabel">性别</label><div class="colsm8"><input type="radio" name="sex" id="inlineRadio1" value="男"<c:iftest="${student.sex=='男'}">checked="checked"</c:if> /> 男<input type="radio" name="sex" id="inlineRadio2" value="女"<c:iftest="${student.sex=='女'}">checked="checked"</c:if> /> 女</div></div><div class="formgroup"><label for="inputage3"class="colsm4 controllabel">年龄</label><div class="colsm8"><input type="text"class="formcontrol" id="inputage3"name="age"placeholder="年龄" value="${student.age}"></div></div><div class="formgroup"><label for="inputage3"class="colsm4 controllabel">身高</label><div class="colsm8"><input type="text"class="formcontrol" id="inputheight3"name="height"placeholder="身高"value="${student.height}"></div></div><div class="formgroup"><label for="inputage3"class="colsm4 controllabel">学院</label><div class="colsm8"><selectclass="formcontrol" name="collage" id="collage"><option value="A"<c:if test="${student.sex=='A'}">selectde</c:if>>软件学院</option><option value="B"<c:if test="${student.sex=='B'}">selectde</c:if>>计院</option><option value="C"<c:if test="${student.sex=='C'}">selectde</c:if>>经济学院</option><option value="D"<c:if test="${student.sex=='D'}">selectde</c:if>>马克思主义学院</option><option value="E"<c:if test="${student.sex=='E'}">selectde</c:if>>电气学院</option></select></div></div><div class="formgroup"><label for="inputage3"class="colsm4 controllabel" >照片</label><div class="colsm8"><input type="file"id="inputPhoto3" name="photo"placeholder="浏览..." ></div></div><div class="formgroup"><label for="inputage3" class="colsm4 controllabel">简历</label><div class="colsm8"><input type="file"id="inputresume" name="resume"placeholder="浏览..."></div></div><div class="formgroup"><div class="colsmoffset4 colsm8"><button type="button" class="btn btndefault" id="formButton">提交</button></div></div></form>(2)<form class="formhorizontal" action="down.do"method="post" id="stuIdform" ><div class="formgroup"><label class="colsm4 controllabel">简历下载</label></div><div class="formgroup"><label for="inputEmail3"class="colsm4 controllabel">学号</label><div class="colsm8"><input type="text"class="formcontrol" id="inputstuId3"name="stuId"placeholder="学号"></div></div><div class="formgroup"><div class="colsmoffset4 colsm8"><button type="button"class="btn btndefault" id="formButton">下载</button></div></div></form>(3)<form class="formhorizontal" action="ExportServlet" method="post" id="stuIdform" ><div class="formgroup"><label class="colsm4 controllabel">数据导出</label></div><div class="formgroup"><label for="inputEmail3"class="colsm4 controllabel">年龄</label><div class="colsm3"><input type="text"class="formcontrol" name="minAge"placeholder="年龄"></div><label class="colsm1 controllabel"></label><div class="colsm3"><input type="text" class="formcontrol" name="maxAge"placeholder="年龄"></div></div><div class="formgroup"><div class="colsmoffset4 colsm8"><button type="button" class="btn btndefault" id="formButton">导出</button></div></div></form>2.编写相应的servlet(1)Part partPhoto = request.getPart("photo");Part resumePart = request.getPart("resume"); UploadService upload = new UploadService();StudentMessage message = new StudentMessage(); String photoName =upload.getFileName(partPhoto);String resumeName =upload.getFileName(resumePart);String contextPath = (String)request.getAttribute("contextPath");upload.writeTo(resumeName, resumePart, contextPath);upload.writeTo(photoName,partPhoto,contextPath);String Id = request.getParameter("Id")+"";String stuId = request.getParameter("stuId"); String name = request.getParameter("name");String age = request.getParameter("age");String sex = request.getParameter("sex");String password =request.getParameter("password");String height = request.getParameter("height"); String collage =request.getParameter("collage");message.setAge((age!="")?Integer.parseInt(age):0);message.setCollage(collage);message.setHeight(height);message.setName(name);message.setPassword(password);message.setSex(sex);message.setStuId(stuId);message.setPhoto(photoName);message.setResume(resumeName);InsertInto insert = new InsertInto();UpdataService upDao = new UpdataService();if(Id.equals("")||Id==null){Id = System.currentTimeMillis()+stuId;System.out.println(Id);message.setId(Id);if(insert.insertData(message)){System.out.println("插入成功");}request.getRequestDispatcher("/login.jsp").forward(requ est, response);}else{message.setId(Id);upDao.updata(message);request.getRequestDispatcher("/show.do").forward(reques t, response);}(2)String stuId = request.getParameter("stuId");StudentMessage message = new StudentMessage(); message.setStuId(stuId);Connection conn = (Connection)request.getAttribute("dbconn");DownService down = new DownService();String photoName = down.selectResume(message, conn);String photoPath =request.getAttribute("contextPath") +File.separator+photoName;//response.setContentType(getMimeType(photoName));//设置ContentDispositionresponse.setHeader("ContentDisposition", "attachment;filename="+photoName);InputStream in = newFileInputStream(photoPath);ServletOutputStream out = response.getOutputStream();byte buffer[] = new byte[1024];int len = 0;while((len=in.read(buffer))>0){out.write(buffer,0,len);}in.close();out.close();(3)int minAge =Integer.parseInt(request.getParameter("minAge")); int maxAge =Integer.parseInt(request.getParameter("maxAge")); Connection conn = (Connection)request.getAttribute("dbconn");ExportExcelService export = new ExportExcelService();List<StudentMessage> list =export.selectByAge(minAge, maxAge, conn);HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet("学生表"); sheet.setDefaultColumnWidth(15);HSSFCellStyle style = wb.createCellStyle(); HSSFRow row = sheet.createRow(0);//style.setAlignment(HSSFCellStyle.ALIGN_CENTER); HSSFCell cell = row.createCell(0);cell.setCellValue("学号");cell.setCellStyle(style);cell = row.createCell(1);cell.setCellValue("姓名");cell.setCellStyle(style);cell = row.createCell(2);cell.setCellValue("年龄");cell.setCellStyle(style);cell = row.createCell(3);cell.setCellValue("性别");cell.setCellStyle(style);cell = row.createCell(4);cell.setCellValue("身高");cell.setCellStyle(style);cell = row.createCell(5);cell.setCellValue("学院");cell.setCellStyle(style);cell = row.createCell(6);cell.setCellValue("密码");cell.setCellStyle(style);cell = row.createCell(7);cell.setCellValue("照片");cell.setCellStyle(style);for (int i = 0; i < list.size(); i++) {row = sheet.createRow(i + 1);row.createCell(0).setCellValue(list.get(i).getStuId()); row.createCell(1).setCellValue(list.get(i).getName()); row.createCell(2).setCellValue(list.get(i).getAge()); row.createCell(3).setCellValue(list.get(i).getSex()); row.createCell(4).setCellValue(list.get(i).getHeight());row.createCell(5).setCellValue(list.get(i).getCollage() );row.createCell(7).setCellValue(list.get(i).getPhoto());row.createCell(6).setCellValue(list.get(i).getPassword( ));}try {OutputStream out =response.getOutputStream();response.reset();response.setHeader("Contentdisposition", "attachment; filename=学生信息表.xls");response.setContentType("application/msexcel");wb.write(out);out.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}五、实验结果分析欧阳美创编 2021.01.01 欧阳美创编 2021.01.01 对实验内容分析之后,结合百度的知识和老师的PPT内容,进行了实验的操作,实验过后我进一步的熟悉了servlet 处理表单提交的请求,对javaweb的学习有了更好的理解。

java实现文件上传和下载

java实现文件上传和下载

java实现⽂件上传和下载本⽂实例为⼤家分享了java实现⽂件上传和下载的具体代码,供⼤家参考,具体内容如下⽂件的上传upload:⽂件上传客户端通过表单的⽂件域file 把客户端的⽂件上传保存到服务器的硬盘上页⾯⾸先对上传的表单有以下要求:必须有⽂件域:input type=file表单提交⽅式:method=post表单的 enctype=multipart/form-data<form method="post" action="/user/regist" enctype="multipart/form-data"><table style="border: chartreuse;solid:2px"><tr><th>⽤户名</th><td><input type="text" name="username"></td></tr><tr><th>密码</th><td><input type="password" name="password"></td></tr><tr><th>⽤户头像</th><td><input type="file" name="photo"> </td></tr><tr><td colspan="2"><input type="submit" value="提交"></td></tr></table></form>Servlet1)⾸先要导⼊以下两个jar包,通过commons-fileupload实现⽂件上传2)创建⼀个⼯⼚对象DiskFileItemFactory,在创建⼀个多部件表单解析器ServletFileUpload,构造⽅法传⼊⼯⼚对象3)解析器解析请求对象,获得⼀个list集合,其中list集合存储的是⼀个⼀个的fileItem对象,⼀个fileItem对应⼀个组件,也就是⼀个<input>4) 遍历集合⽤isFormField()⽅法判断是否为普通组件,然后着重处理⽂件域组件5)获取⽂件名,并⽤getRealPath⽅法获取服务器上传⽂件所在路径,创建新⽂件夹6)获取输⼊流和创建输出流,进⾏⽂件的读写@WebServlet(value = "/user/regist")public class UploadServlet extends HttpServlet {protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//创建⼀个⼯⼚对象DiskFileItemFactory factory = new DiskFileItemFactory();//创建⼀个多部件解析器对象ServletFileUpload fileUpload = new ServletFileUpload(factory);User user = new User();FileOutputStream out=null;try {//⽤解析器对象解析请求,返回⼀个FileItem类型的集合List<FileItem> list = fileUpload.parseRequest(req);for (FileItem fileItem : list) {/*** fileItem.getFieldName());:::获取组件的name值* fileItem.getName());::::获取⽂件域的⽂件名* fileItem.getSize());::::获取数据的字节个数* fileItem.getString());::::获取数据的字符串* fileItem.isFormField());:::判断是否为普通组件*///判断部件是否为普通组件if (fileItem.isFormField()) {//普通组件//获取组件名字也就是name的值String fieldName = fileItem.getFieldName();//获取组件的值也就是value的值String value = fileItem.getString("utf-8");if ("username".equals(fieldName)) { //设置实体类的属性user.setUsername(value);} else if ("password".equals(fieldName)) {user.setPassword(value);}} else {// ⽂件域//获取⽂件名String fielName = fileItem.getName();//输⼊流来读数据InputStream in = fileItem.getInputStream();//设置⽂件写出的路径,并⽤随机码来保证图⽚可以重复String path=req.getServletContext().getRealPath("/imgs/"+ UUID.randomUUID()+fielName);System.out.println("⽂件路径为:"+path);File file = new File(path);out = new FileOutputStream(file);//利⽤commons-io-1.4.jar的IOUtils的copy⽅法直接实现⽂件的复制IOUtils.copy(in,out);user.setPhoto(file.getName());}}} catch (Exception e) {e.printStackTrace();}finally {if(out!=null){out.close();}}req.getSession().setAttribute("user",user);req.getRequestDispatcher("/sucess.jsp").forward(req,resp);}}⽂件的下载页⾯只需⼀个超链接,传需要下载的⽂件名,或者直接输⼊路径在浏览器例: <a href="<c:url value='/file/download?fileName=14.jpg'/>" >狗狗1</a><br/>Servlet1)接收参数,获取⽂件名2)获取imgs的路径,也就是存储⽂件的⽂件夹的路径,然后创建⽂件,传⼊该路径和⽂件名3)创建输⼊流读取⽂件4)设置响应头,⾸先根据⽂件名字获取⽂件的⼤类型,设置响应头Content-Type指定响应的类型;设置响应头Content-Disposition,指定⽂件以附件形式保存到本地磁盘5)⽤响应获取输出流,读出⽂件到客户端@WebServlet("/user/download")public class DownloadServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");//获取要下载的⽂件名String fileName = request.getParameter("fileName");System.out.println(fileName);//获取服务器中存储图⽚的⽂件夹的路径String path1 = request.getServletContext().getRealPath("/imgs");String path=path1+"/"+fileName;File file = new File(path);//创建输⼊流读⽂件FileInputStream in = new FileInputStream(file);//通过⽂件名字获取⽂件的⼤类型String type = request.getServletContext().getMimeType(fileName);//设置响应头ContentType指定响应内容的类型response.setHeader("Content-type",type);//设置响应头Content-Disposition 指定以附件形式保存响应的信息response.setHeader("Content-Disposition","attachment;filename="+(URLEncoder.encode(fileName, "utf-8"))); ServletOutputStream out = response.getOutputStream();//实现⽂件的读写IOUtils.copy(in,out);if(in!=null){in.close();}}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

18.Javaweb中文件的上传和下载【重要】

18.Javaweb中文件的上传和下载【重要】

18.Javaweb中⽂件的上传和下载【重要】Javaweb中⽂件的上传和下载⽂件上传⽂件上传指的是⽤户通过浏览器向服务器上传某个⽂件,服务器接收到该⽂件后会将该⽂件存储在服务器的硬盘中,通常不会存储在数据库中,这样可以减轻数据库的压⼒并且在⽂件的操作上更加灵活,常见的功能是上传头像图⽚。

⽂件上传的原理所谓的⽂件上传就是服务器端通过request对象获取输⼊流,将浏览器端上传的数据读取出来,保存到服务器端。

⽂件上传的要求提供form表单,表单的提交⽅式必须是post【get请求装不下那么多】form表单中的enctype属性必须是 multipart/form-data 【照着做就⾏】表单中提供input type=”file”上传输⼊域 【⽂件那个表单】先来个表单:<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><figure><img src=""></figure><form action="#" method="post" accept-charset="utf-8" enctype="multipart/form-data"> <!--# 提交地址记得改!--><input type="file" name="photo"><br><input type="submit" value="上传头像"></form></body></html>来个Servlet来接收⼀下这个图⽚:package upload;import java.io.IOException;import java.io.InputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** ⽂件上传例⼦*/public class file extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求的输⼊流InputStream is = request.getInputStream();//读取输⼊流中的数据int leng = 0;byte[] bytes = new byte[1024];while ((leng = is.read(bytes)) != -1) {//先打印控制台看看System.out.println(new String(bytes,0,leng));}}}打印出来的数据:------WebKitFormBoundarypM4ZEsxzVdl0NfZVContent-Disposition: form-data; name="photo"; filename="4-2 鍥剧墖鍒囨崲鏁堟灉[20210508-164643].jpg"Content-Type: image/jpeg反正⼀堆乱码但是头部我们是看的懂的就是⼀些标签的属性和上传的照⽚名字!和⽂件类型!如何解决?请看:FileUpload⼯具的使⽤在实际开发中通常会借助第三⽅⼯具来实现上传功能,应⽤较多的是apache旗下的Commons-fileupload。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量、大文件的上传下载控件。

文章在比较了一系列FTP客户库的基础上,就其中一个比较通用且功能较强的j-ftp类库,对一些比较常见的功能如进度条、断点续传、内外网的映射、在Applet中回调JavaScript函数等问题进行详细的阐述及代码实现,希望通过此文起到一个抛砖引玉的作用。

一、引子笔者在实施一个项目过程中出现了一种基于Web的文件上传下载需求。

在全省(或全国)各地的用户,需要将一些文件上传至某中心的文件服务器上。

这些文件是用于一些大型的工程建设,可能涉及到上千万甚至上亿的建设工程。

文件具有三个鲜明的特征:一是文件大,可能达到50M;二是文件数量多,有可能15个左右;三是数据安全性方面要求数字签名及数据加密。

首先考虑到是基于HTTP的传输方式。

但笔者通过比较很快发现满足上面的需求:1:用HTTP协议上传,似乎更适合web编程的方便性;上传小于1M文件速度要比用FTP协议上传文件略快。

但对于批量及大文件的传输可能无能为力。

当然,它也有它的优势,如不像FTP那样,必须在服务器端启动一个FTP服务。

2:用FTP协议上传文件大于1M的文件速度比HTTP快。

文件越大,上传的速度就比HTTP上传的速度快数倍。

而且用java编写程序;FTP比HTTP方便。

笔者曾经使用VB也写过ActiveX控件来进行批量文件的上传下载,其功能也很强大。

只是由于没有对CAB文件或OCX进行专门的数字签名,因此需要进行客户端烦琐的设置,如设置安全站点、降低客户端的安全级别等等,因而放弃了些方案。

同时考虑到在需在客户端对文件进行数字签名及数据加密,决定采用Applet 的方式实现。

文件上传之前,在客户端可以获取本地USBKEY密钥信息,完成对上传文件的加密和签名处理。

虽然采用Applet要求在客户端安装JRE运行时环境,给客户端的管理及使用带来一度的不方便性,但是相对起如此大量的文件及文件的安全性,这也许已经算是比较小的代价了。

总结一下运行的环境为:FTP服务器端:Serv-U,专业的FTP服务器端程序,网上有现成的软件下载,当然读者也可能自己写一个服务器端的FTP文件接收程序来进行解释。

如果没有特殊要求或功能的话,Serv-U应该可以满足我们一般上传下载的需求了;客户端:Java applet,当年让Java大火了一把的号称与微软的ActiveX相提并论的技术当然,现在Java出了JavaFX,是不是Applet的替代品呢?应用环境:Internet网,最终目的。

二、Java FTP客户端库的选择让我们设想这样一个情形--我们想写一个纯Java的从一个远程计算机上运行的FTP服务器上传下载文件的应用程序;我们还希望能够得到那些供下载的远程文件的基本文件信息,如文件名、数据或者文件大小等。

尽管从头开始写一个FTP协议处理程序是可能的,并且也许很有趣,但这项工作也是困难、漫长并且存在着潜在的危险。

因为我们不愿意亲自花时间、精力、或者金钱去写这样的一个处理程序,所以我们转而采用那些已经存在的可重用的组件。

并且很多的库存在于网上。

找一个优秀的适合我们需要的Java FTP 客户端库并不像看起来那么简单。

相反这是一项非常痛苦复杂的工作。

首先找到一个FTP客户端库需要一些时间,其次,在我们找到所有的存在的库后,我们该选哪一个呢?每个库都适合不同的需求。

这些库在性能上是不等价的,并且它们的设计上有着根本上的差别。

每个类库都各具特点并使用不同的术语来描述它们。

因而,评价和比较FTP客户端库是一件困难的事情。

使用可重用组件是一种值得提倡的方法,但是在这种情况下,刚开始往往是令人气馁的。

后来或许有点惭愧:在选择了一个好的FTP库后,其后的工作就非常简单了,按简单的规则来就行了。

目前,已经有很多公开免费的ftp客户端类库,如simpleftp、J-ftp等,还有很多其他的ftpclient。

如下表所示,表中未能全部列出,如读者有更好的客户端FTP类库,请进行进一步的补充。

FTP客户端类库名备注J-ftp J-ftpsimpleftp /files/simpleftp.jar ftpclient .ftp.FTPClient FTPProtocol work.ftp.protocol.FTPProtocol FtpConnection .FtpConnectionFTPClient .ftp.FTPClient FTPClient jshop.jnet.FTPClientFtpClient .ftp.FtpClientFTP com.cqs.ftp.FTPFtp cz.dhl.ftp.FtpFTPClient org.globus.io.ftp.FTPClient在本文中,笔者采用是J-ftp。

这个是个开源的且功能十分强大的客户端FTP 类库。

笔者很喜欢,同时也向各位读者推荐一下。

算了免费为它做一个广告。

三、基本功能1、登陆采用FTP进行文件传输,其实本质上还是采用.socket进行通信。

以下代码只是类.FtpConnection其中一个login方法。

当然在下面的代码,为了节省版面,以及将一些原理阐述清楚,笔者将一些没必要的代码去掉了,如日志等代码。

完整的代码请参考J-ftp的源代码或是笔者所以的示例源代码,后面的代码示例也同理:public int login(String username, String password){ername = username;this.password = password;int status = LOGIN_OK;jcon = new JConnection(host, port);if(jcon.isThere()){in = jcon.getReader();if(getLine(POSITIVE) == null)//FTP220_SERVICE_READY) == null){ok = false;status = OFFLINE;}if(!getLine(loginAck).startsWith(POSITIVE))//FTP230_LOGGED_IN)){if(success(POSITIVE))//FTP230_LOGGED_IN)){}else{ok = false;status = WRONG_LOGIN_DATA;}}}else{if(msg){Log.debug("FTP not available!");ok = false;status = GENERIC_FAILED;}}if(ok){connected = true;system();binary();String[] advSettings = new String[6];if(getOsType().indexOf("OS/2") >= 0){LIST_DEFAULT = "LIST";}if(LIST.equals("default")){//just get the first item (somehow it knows first is the//FTP list command)advSettings = LoadSet.loadSet(Settings.adv_settings);//*** IF FILE NOT FOUND, CREATE IT AND SET IT TO LIST_DEFAULTif(advSettings == null){LIST = LIST_DEFAULT;SaveSet s = new SaveSet(Settings.adv_settings, LIST);}else{LIST = advSettings[0];if(LIST == null){LIST = LIST_DEFAULT;}}}if(getOsType().indexOf("MVS") >= 0){LIST = "LIST";}//***fireDirectoryUpdate(this);fireConnectionInitialized(this);}else{fireConnectionFailed(this, new Integer(status).toString());}return status;}此登陆方法中,有一个JConnection类,此类负责建立socket套接字,同时,此类是一种单独的线程,这样的好处是为了配合界面的变化,而将网络的套接字连接等工作做为单独的线程来处理,有利于界面的友好性。

下面是.JConnection类的run方法,当然,此线程的启动是在JConnection类的构造方法中启动的。

public void run(){try{s = new Socket(host, port);localPort = s.getLocalPort();//if(time > 0) s.setSoTimeout(time);out = new PrintStream(new BufferedOutputStream(s.getOutputStream (),Settings.bufferSize));in = new BufferedReader(new InputStreamReader(s.getInputStream()),Settings.bufferSize);isOk = true;// }}catch(Exception ex){ex.printStackTrace();Log.out("WARNING: connection closed due to exception (" + host +":" + port + ")");isOk = false;try{if((s != null) && !s.isClosed()){s.close();}if(out != null){out.close();}if(in != null){in.close();}}catch(Exception ex2){ex2.printStackTrace();Log.out("WARNING: got more errors trying to close socket and strea ms");}}established = true;}此run方法中的socket这里说明一下,此类实现客户端套接字(也可以就叫“套接字”),套接字是两台机器之间的通信端点。

相关文档
最新文档