文件上传与下载
- 格式:doc
- 大小:41.50 KB
- 文档页数:5
Centos7上传⽂件和下载⽂件命令Centos7上传⽂件和下载⽂件命令使⽤⼯具:SecureCRT 或 Xshell步骤⼀:安装lrzsz软件,root权限下。
安装lrzsz(zmodem)对于CentOS系统:[root@localhost ~]# yum -y install lrzsz对于debian系统:[root@localhost ~]# apt-get install lrzsz步骤⼆:上传⽂件。
使⽤rz命令,把⽂件从windows系统上传到linux系统中在SecureCRT或Xshell的命令⾏中,cd到你要放置上传⽂件的路径下,输⼊rz命令,SecureCRT或者Xshell会弹出⽂件选择对话框,在查找范围中找到你要上传的⽂件,按Add按钮。
然后OK就可以把⽂件上传到linux上了。
或者在Transfer->Zmodem Upoad list弹出⽂件选择对话框,选好⽂件后按Add按钮。
然后OK窗⼝⾃动关闭。
然后在linux下选中存放⽂件的⽬录,输⼊rz命令。
liunx就把那个⽂件上传到这个⽬录下了。
[root@localhost www]# rz步骤三:下载⽂件。
使⽤sz命令,把⽂件从linux系统下载到windows系统中在SecureCRT或Xshell的命令⾏中,输⼊:sz filename,⼿动选择你要存放在windows的⽬录(⽐如桌⾯)。
zmodem接收可以⾃⾏启动。
[root@localhost www]# sz xxxx(⽂件名) //下载单个⽂件[root@localhost www]# sz xxxx/*.* //下载整个⽂件夹。
利⽤Layui进⾏⽂件的上传和下载1、⽂件下载接⼝ /*** 下载附件接⼝* */@OpdSkip@RequestMapping(value = "/downloadFile",method = RequestMethod.GET)public CommonResponse<Boolean> downloadFile(String address, HttpServletRequest request, HttpServletResponse response) throws IOException{ System.out.println("address:"+address);if(address == null){return CommonResponse.FAIL(500,"附件下载地址为空");}DownloadHelper.setting(request, response, "application/x-img;charset=UTF-8", address);return cveHoleManageService.downloadFile(address,request,response);}2、DownloadHelper类 /*** @author: zuowuliu* @Data: 2020/8/18 16:54*/public class DownloadHelper {public static String formatName(HttpServletRequest request, String fileName) {try {if (request.getHeader("User-Agent").toUpperCase().indexOf("TRIDENT") > 0) {return URLEncoder.encode(fileName, "UTF-8");} else {return new String(fileName.getBytes("UTF-8"), "ISO8859-1");}} catch (UnsupportedEncodingException e) {e.printStackTrace();}return null;}/*** 兼⽤⼀切浏览器** @param request* @param response* @param contentType* @param fileName* @throws IOException*/public static void setting(HttpServletRequest request, HttpServletResponse response, String contentType, String fileName) throws IOException {String enFileName = formatName(request, fileName);response.setHeader("Content-Disposition", String.format("attachment; filename=%s", enFileName));response.setCharacterEncoding("UTF-8");if (StringUtils.isNotBlank(contentType)) {response.setContentType(contentType);}}}3、download⽅法//下载附件public CommonResponse<Boolean> downloadFile(String address, HttpServletRequest request, HttpServletResponse response) throws IOException{ //由于下载的这个地址本⾝就是绝对的存储的地址File file1 = new File(address);OutputStream os = response.getOutputStream();FileInputStream fileInputStream = new FileInputStream(file1);DataInputStream dataInputStream = new DataInputStream(fileInputStream);int r;while((r=dataInputStream.read())!=-1) {os.write(r);}System.out.println("已下载...");fileInputStream.close();dataInputStream.close();return CommonResponse.OK(true);}。
golang语⾔实现的⽂件上传与⽂件下载功能⽰例本⽂实例讲述了golang实现的⽂件上传与⽂件下载功能。
分享给⼤家供⼤家参考,具体如下:upload.go复制代码代码如下:package commonimport ("io/ioutil""os""path""/gin-gonic/gin""googo.co/goo""googo.co/utils")const (UPLOAD_DIR = "static/")type Upload struct {}func (this Upload) DoHandle(c *gin.Context) *goo.Result {fh, err := c.FormFile("file")if err != nil {return goo.Err(700, "上传失败:"+err.Error(), err.Error())}f, err := fh.Open()if err != nil {return goo.Err(701, "上传失败:"+err.Error(), err.Error())}defer f.Close()bytes, err := ioutil.ReadAll(f)if err != nil {return goo.Err(702, "上传失败:"+err.Error(), err.Error())}md5File := utils.MD5(bytes)fpath := md5File[0:2] + "/" + md5File[2:4] + "/"if err := os.MkdirAll(UPLOAD_DIR+fpath, 0755); err != nil {return goo.Err(703, "上传失败:"+err.Error(), err.Error())}fname := fpath + md5File[8:24] + path.Ext(fh.Filename)fw, err := os.Create(UPLOAD_DIR + fname)if err != nil {return goo.Err(704, "上传失败:"+err.Error(), err.Error())}defer fw.Close()if _, err := fw.Write(bytes); err != nil {return goo.Err(705, "上传失败:"+err.Error(), err.Error())}return goo.Succ(gin.H{"url": "/file/" + fname,})}复制代码代码如下:// 上传⽂件r.POST("/upload", goo.Handler(common.Upload{}))// 下载⽂件r.StaticFS("/file", http.Dir("./static"))// 访问http://localhost:18000/file/ab/cd/efghijk.png希望本⽂所述对⼤家Go语⾔程序设计有所帮助。
Linux本机与服务器⽂件互传及Linux服务器⽂件上传下载命令写法⼀、Linux下⽂件互传,scp命令实例1、Linux下⽬录复制:本机->远程服务器scp -r /home/abc/test1 root@192.168.0.1:/home/bcd/test2 (本机⽬录路径 远程机⽤户名@IP:/⽬录)2、Linux下⽬录复制:远程服务器->本机scp -r root@192.168.0.1:/home/bcd/test2 /home/abc/test1 (远程机⽤户名@IP:/⽬录本机⽬录路径)3、Linux下⽂件复制:远程服务器->本机scp -P 22 root@192.168.0.1:/home/1.txt /home/1.txt注:如果端⼝号有更改,需在scp 后输⼊:-P 端⼝号(注意是⼤写,ssh的命令中 -p是⼩写)⼆、Windows与Linux互传,pscp命令实例(注:⽅法很多,这⾥介绍的是通过pscp命令)前提:下载pscp.exe,设置path环境变量。
cmd命令:上传:pscp d:\upload.txt username@192.168.1.1:/home/username/upload/upload.txt下载:pscp root@192.168.1.1:/home/username/download/download.txt d:\download.txt总结以上所述是⼩编给⼤家介绍的Linux本机与服务器⽂件互传及Linux服务器⽂件上传下载命令写法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
在此也⾮常感谢⼤家对⽹站的⽀持!。
上传文件和导出的测试用例设计一:上传图片对于上传的文件,假设系统要求上传的文件为jpg或gif格式图片,大小为<=5M的文件,我们在设计测试用例时,应该从以下几个方面进行考虑:1:文件类型正确,文件大小合适的校验例如:上传一种jpg或gif的格式图片,文件大小为4.9M,结果为上传成功2:文件类型正确,文件大小不合适的校验例如:上传一种jpg或gif的格式图片,文件大小为5.1M,提示为:“上传的附件中大小不能超过5M"3:文件类型正确,文件大小合适的校验例如:上传一种jpg或gif的格式图片,文件大小为5M,结果为上传成功4:文件类型错误,文件大小合适的校验例如:上传。
doc;。
xls;ppt;bmp;jpeg;psd;tiff;tga;png;swf;svg;pcx;dxf;wmf;emf;lic;eps;.txt等格式文件,文件大小合适,提示“只能上下jpg或gif格式图片”5:文件类型和文件大小合法,上传一个0kb的图片,提示信息:“请重新上传文件,或者是不能上传0kb的图片"6:文件类型和文件大小合法,上传一个正在使用中的图片(即打开该图片,在上传该图片),上传成功7:文件类型和文件大小合法,手动输入一个存在的图片地址,点击上传,上传成功8:文件类型和文件大小合法,手动输入一个不存在的图片地址,点击上传,提示:“请正确选择要上传的文件”9:文件类型和大小都合法,手动输入一个存在的图片名称,点击上传,一般情况下系统会提示:“请正确选择要上传的文件的路径”二:文件导出1、验证导出文件名长度,根据具体情况而定2、验证导出文件为空的情况3、验证导出文件名为特殊字符的情况4、验证导出全部资料的情况,导出的信息是否正确5、验证导出部分资料的情况,导出的信息是否正确6、验证导出大量数据时的时间是否在合理的时间范围内7、验证导出目的磁盘空间已满的情况下,导出是否有友好的处理方式8、验证导出目的的文件夹为只读的情况下,导出时是否有友好的的提示信息——-----—---—--——----———---———-—-——--———--—-—————--——--—--—-----文件上传:***页面***1、页面美观性、易用性2、按钮文字正确性3、说明文字是否正确4、正确/错误的提示文字是否正确5、提示当前位置是否正确,并且和其他页面保持一致格式6、必添项的标示是否正确***功能***1、路径是否可以手工输入2、上传文件超过最大值是在提交前校验还是提交后校验3、上传文件格式是否全部支持4、上传文件是否支持中文名称5、文件名称的最大值、最小值、特殊字符(包含空格)、使用程序语句是否会对其造成影响、中文名称是否能正常显示6、对于是否发布的设置是否正确7、简介最大值、特殊字符、使用程序语句是否会对其造成影响***按钮***1、保存按钮·对输入项有错误提示后光标提示是否正确·对输入项的错误提示是否描述正确·对必添项是否进行校验2、清空按钮·是否清除了填写内容3、返回按钮·是否返回上一页面文件下载:***页面***1、当前位置的提示是否现实正确2、页面美观性、易用性3、按钮文字是否正确4、说明性文字是否正确5、正确/错误的提示文字是否正确***功能***1、右键另存为是否可以正确下载文件,并且记录下载次数·工具下载是否正确,并且记录下载次数2、单击下载是提示下载还是在页面打开·直接打开是否显示正确·对于本机没有安装工具的文件是否能够打开,是否能给出正确的提示·对于直接在页面内打开的内容是否能够显示正常,页面美观性·保存到本地是否能正确显示·取消下载是否会纪录下载次数3、下载次数是否被正确记录4、后台没有发布的文件是否在前台可以找到并下载5、后台设置了下载权限的文件是否可以被正确看到、是否可以下载***按钮***返回按钮是否回到上一页面再补充一些其他的常见测试点:1、上传文件名测试,检查不符合文件名规范2、上传文件名类型测试,检查不同文件类型是否支持如:.rar,.mp3,avi等3、上传文件大小测试,检查不同文件规格大小如:0字节文件, 1kb,200kb, 2mb, 20mb,2g等4、上传文件容错性测试:如检查覆盖同文件操作;5、上传文件异常情况测试:如硬盘空间不足6、上传文件速率性能测试:检查上传不同的文件在不同的网络环境响应速度,及系统资源占用7、上传文件安全性测试:如上传常见木马8、上传文件易用性测试:检查上传文件操作是否让用户易于学习和理解使用等9、上传文件特性测试:如果支持如断点续传等一些特性10、上传文件后,检查是否与源文件一致,包含目录设置等11、上传文件,是否能打开等本文转自:/haoxiaohui617/article/details/8850702文件上传测试用例SC001 功能测试选择符合要求的文件,上传上传成功SC002 上传成功的文件名称显示显示正常(根据需求SC003 查看,下载上传成功的文件上传的文件可查看或SC004 删除上传成功的文件可删除SC005 替换上传成功的文件可替换SC006 上传文件是否支持中文名称根据需求而定SC007 文件路径是否可手动输入根据需求而定SC008 手动输入正确的文件路径,上传上传成功SC009 手动输入错误的文件路径,上传提示,不能上传SC010 文件大小测试符合格式,总大小稍小于限制大小的文件上传成功SC011 符合格式,总大小等于限制的大小的文件上传成功SC012 符合格式,总大小稍大于限制大小的文件在上传初提示附件过SC013 小为0kb的txt文档不能上传SC014 文件名称测试文件名称过长。
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();}}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
使用C#实现FTP的文件上传和下载搭建好FTP服务器后,借助.NET Framework提供的类,实现文件的上传和下载是比较简单的事情,下面我们用C#来实现这一过程。
程序主界面下图便是样例程序的界面,输入登录FTP的“用户名”和“密码”,点击“上传”按钮,弹出“打开文件”对话框,选择要上传的文件,“确定”后开开始将文件上传到指定的FTP服务器的文件夹中。
下载文件时,点击“刷新文件列表”,获得FTP服务器上指定文件夹的文件列表,选中要下载的文件,点击下载,将文件下载到本地。
文件上传因为“上传”要使用到流、多线程、网络等技术,故需要导入.NET Framework 相关的名称空间:System.IO、System.Threading、。
实现Ftp的文件上传的核心类便是FtpWebRequest类。
下面是“上传”按钮的Click事件代码:1://上传按钮代码2:private void btnUpload_Click(object sender, EventArgs e)3: {4: OpenFileDialog openDlg = new OpenFileDialog();5:if (openDlg.ShowDialog() != DialogResult.OK) return;6:7:string fileName = openDlg.FileName;8:this.lblFileName.Text = fileName;9: Thread thread = new Thread(new ThreadStart(delegate() 10: {11:this.UploadFileByFtpWebRequest(fileName,this.txtFTPServerIP.Text, this.txtPath.Text, this.txtUserName.Text, this.txtPassword.Text);12: }));13: thread.Start();14: }下面是UploadFileByFtpWebRequest方法的代码:1:private bool UploadFileByFtpWebRequest(string fileName, string ftpServerIP, string path, string userName, string password) 2: {3:bool result = true;4:string url = string.Format("ftp://{0}/{1}/{2}", ftpServerIP, path, fileName.Substring(stIndexOf(@"\") + 1));5:6:FtpWebRequest request =(FtpWebRequest)WebRequest.Create(url);7:request.Credentials = new NetworkCredential(userName, password);8:request.Method = WebRequestMethods.Ftp.UploadFile;9:10:Stream stream = request.GetRequestStream();11:FileStream fileStream = new FileStream(fileName, FileMode.Open);12:13:int packageSize = 1024 * 1024;14:int packageCount = (int)(fileStream.Length / packageSize);15:int rest = (int)(fileStream.Length % packageSize);16:this.BeginInvoke(new DoSomething(delegate()17:{18:this.pbarProcessUpload.Maximum = packageCount;19:if(rest != 0) this.pbarProcessUpload.Maximum += 1;20:}));21:22:for (int index = 0; index < packageCount; index++)23:{24:byte[] buffer = new byte[packageSize];25: fileStream.Read(buffer, 0, buffer.Length);26:27: stream.Write(buffer, 0, buffer.Length);28:29:this.BeginInvoke(new DoSomething(delegate()30: {31:this.pbarProcessUpload.Value = index;32: }));33:}34:35:if (rest != 0)36:{37:byte[] buffer = new byte[rest];38: fileStream.Read(buffer, 0, buffer.Length); 39:40: stream.Write(buffer, 0, buffer.Length); 41:42:this.BeginInvoke(new DoSomething(delegate() 43: {44:this.pbarProcessUpload.Value +=1; 45: }));46:}47:48:stream.Close();49:fileStream.Close();50:51:this.BeginInvoke(new DoSomething(delegate()52:{53:this.pbarProcessUpload.Value = 0; 54:}));55:56:return result;57: }58:private delegate void DoSomething();。
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 JSP文件上传简单实例1、index.html代码:<html><head><title>上传图片</title></head><body><form action="do_upload.jsp" method="post" enctype="multipart/form-data"><input type="file" name="Photo"><input type="submit" value="上传"></form></body></html>2、使用到的函数和类说明File类文件和目录路径名的抽象表示形式,File(parent,child)方法根据parent 抽象路径名和child 路径名字符串创建一个新File实例FileOutputStream文件输出流,InputStream输入流,将输入数据看成一根管道,可以形象的将输入流比喻成管道的入口,而输出流比喻成管道的出口。
read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个字节数组中。
read() 从此输入流中读取一个数据字节。
write(int b) 将指定字节写入此文件输出流,write(byte[] b, int off, int len) 将指定字节数组中从偏移量off 开始的len 个字节写入此文件输出流。
write(byte[] b) 将 b.length 个字节从指定字节数组写入此文件输出流中Random.readLine()逐行读入,Random.seek(int pos)设置到此文件开头测量到的文件指针偏移量,该位置发生下一个读取和写入操作,Random.getFilePointer()返回此文件当前偏移量,Random.readByte()此方法从该文件的当前文件指针开始读取第一个字节。
文件上传与下载 上传 文件上传概述 实现web开发中的文件上传功能,需完成如下二步操作: • 在web页面中添加上传输入项 • 在servlet中读取上传文件的数据,并保存到服务器硬盘中。 如何在web页面中添加上传输入项? • 标签用于在web页面中添加文件上传输入项,设置文件上传输入项时须注意: • 1、必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。 • 2、必须把form的enctype属值设为multipart/form-data.设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。 • 3、表单的提交方式要是post 如何在Servlet中读取文件上传数据,并保存到本地硬盘中? • Request对象提供了一个getInputStream方法,通过这个方法可以读取到客户端提交过来的数据。但由于用户可能会同时上传多个文件,在servlet端编程直接读取上传数据,并分别解析出相应的文件数据是一项非常麻烦的工作,示例。 • 为方便用户处理文件上传数据,Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现。 使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io。commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持。
文件上传步骤 实现步骤 1、创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录 2、使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制。 3、调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。 4、对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件 • True 为普通表单字段,则调用getFieldName、getString方法得到字段名和字段值 • False 为上传文件,则调用getInputStream方法得到数据输入流,从而读取上传数据。
FileUpload上传操作核心API 1、DiskFileItemFactory 磁盘文件项工厂类 public DiskFileItemFactory(int sizeThreshold, java.io.File repository) 构造工厂时,指定内存缓冲区大小和临时文件存放位置
public void setSizeThreshold(int sizeThreshold) 设置内存缓冲区大小,默认10K public void setRepository(java.io.File repository)设置临时文件存放位置,默认System.getProperty("java.io.tmpdir").
内存缓冲区: 上传文件时,上传文件的内容优先保存在内存缓冲区中,当上传文件大小超过缓冲区大小,就会在服务器端产生临时文件 临时文件存放位置: 保存超过了内存缓冲区大小上传文件而产生临时文件 * 产生临时文件可以通过 FileItem的delete方法删除
2、ServletFileUpload 文件上传核心类 static boolean isMultipartContent(javax.servlet.http.HttpServletRequest request) 判断request的编码方式是否为multipart/form-data
java.util.List parseRequest(javax.servlet.http.HttpServletRequest request) 解析request,将请求体每个部分封装FileItem对象,返回List
void setFileSizeMax(long fileSizeMax) 设置单个文件上传大小 void setSizeMax(long sizeMax) 设置总文件上传大小
void setHeaderEncoding(java.lang.String encoding) 设置编码集 解决上传文件名乱码 *****
3、FileItem 表示文件上传表单中 每个数据部分 boolean isFormField() 判断该数据项是否为文件上传项,true 不是文件上传 false 是文件上传 if(fileItem.isFormField()){ // 不是上传项 java.lang.String getFieldName() 获得普通表单项name属性 java.lang.String getString() / java.lang.String getString(java.lang.String encoding) 获得普通表单项value属性 传入编码集用来解决输入value乱码 }else{ // 是上传项 java.lang.String getName() 获得上传文件名 (注意IE6存在路径) java.io.InputStream getInputStream() 获得上传文件内容输入流 // 上传文件 void delete() 删除临时文件(删除时,必须要管理输入输出流) }
注意事项:因为文件上传表单采用编码方式multipart/form-data 与传统url编码不同,所有getParameter 方法不能使用 setCharacterEncoding 无法解决输入项乱码问题
JavaScript的多文件上传表单 技巧: • 每次动态增加一个文件上传输入框,都把它和删除按纽放置在一个单独的div中,并对删除按纽的onclick事件进行响应,使之删除删除按纽所在的div。 • 如: this.parentNode.parentNode.removeChild(this.parentNode);
上传文件存在的问题 ➢ 上传文件后,在服务器端保存位置 第一类存放位置:直接存放WebRoot目录下 和 除WEB-INF META-INF的其它子目录下 例如: WebRoot/upload * 客户端可以直接在浏览器上通过url访问位置(资料无需通过权限控制,而可以直接访问) ---- 对上传资源安全性要求不高、或者资源需要用户直接可见 * 例如:购物商城商品图片
第二类存放位置:放入WEB-INF及其子目录 或者 不受tomcat服务器管理目录 例如: WebRoot/WEB-INF/upload 、c:\ 、d:\abc * 客户端无法通过URL直接访问,必须由服务器内部程序才能读取 (安全性较高,可以很容易添加权限控制) * 例如:会员制在线视频
➢ 上传文件在同一个目录重名问题 如果文件重名,后上传文件就会覆盖先上传文件
文件名 UUID filename = UUID.randomUUID().toString() + "_" + filename; ➢ 为了防止同一个目录下方上传文件数量过多 ---- 必须采用目录分离算法 1) 按照上传时间进行目录分离 (周、月 ) 2) 按照上传用户进行目录分离 ----- 为每个用户建立单独目录 3) 按照固定数量进行目录分离 ------ 假设每个目录只能存放3000个文件 ,每当一个目录存满3000个文件后,创建一个新的目录 4) 按照唯一文件名的hashcode 进行目录分离 public static String generateRandomDir(String uuidFileName) { // 获得唯一文件名的hashcode int hashcode = uuidFileName.hashCode(); // 获得一级目录 int d1 = hashcode & 0xf; // 获得二级目录 int d2 = (hashcode >>> 4) & 0xf;
return "/" + d2 + "/" + d1;// 共有256目录l }
➢ 乱码问题 普通编写项 value属性乱码 ------------- fileItem.getString(编码集); 上传文件项 文件名乱码 --------- fileupload.setHeaderEncoding(编码集);
下载 常见文件下载有两种方式 1、超链接直接指向下载资源 如果文件格式浏览器识别,将直接打开文件,显示在浏览器上, 如果文件格式浏览器不识别,将弹出下载窗口 对于浏览器识别格式的文件,通过另存为进行下载
客户端访问服务器静态资源文件时,静态资源文件是通过 缺省Servlet返回的,在tomcat配置文件conf/web.xml 找到 --- org.apache.catalina.servlets.DefaultServlet
2、编写服务器程序,读取服务器端文件,完成下载 必须设置两个头信息 ,来自MIME协议 Content-Type Content-Disposition
response.setContentType(getServletContext().getMimeType(filename)); response.setHeader("Content-Disposition", "attachment;filename=" + filename); // 以附件形式打开,不管格式浏览器是否识别