精华内容
下载资源
问答
  • 文件上传和下载文件上传和下载文件上传和下载文件上传和下载文件上传和下载文件上传和下载文件上传和下载
  • 文件上传和下载

    千次阅读 2017-03-27 19:34:53
    什么是文件上传文件上传就是把用户的信息保存起来。为什么需要文件上传?在用户注册的时候,可能需要用户提交照片。那么这张照片就应该要进行保存。上传组件(工具)为什么我们要使用上传工具?为啥我们需要上传组件...

    什么是文件上传?

    文件上传就是把用户的信息保存起来。

    为什么需要文件上传?

    在用户注册的时候,可能需要用户提交照片。那么这张照片就应该要进行保存。

    上传组件(工具)

    为什么我们要使用上传工具?

    为啥我们需要上传组件呢?当我们要获取客户端的数据,我们一般是通过getParameter()方法来获取的。

    上传文件数据是经过MIME协议进行分割的,表单进行了二进制封装。也就是说:getParameter()无法获取得到上传文件的数据。

    我们首先来看看文件上传http是怎么把数据带过去的

    • jsp页面,表单一定要指定enctype:multipart/form-data
    
        <form action="${pageContext.request.contextPath }/servlet/UploadServlet1" enctype="multipart/form-data" method="post">
            上传用户:<input type="text" name="username"><br/>
            上传文件1:<input type="file" name="file1"><br/>
            上传文件2:<input type="file" name="file2"><br/>
            <input type="submit" value="提交">
        </form>
    
    
    • http抓包

    这里写图片描述

    • 尝试在Servlet上使用getParameter()获取数据
    
    
            String ss = request.getParameter("username");
            System.out.println(ss);
    • 直接使用getParameter是获取不到数据的。

    这里写图片描述

    那么我们要怎么办呢????request对象提供了ServletInputStream流给我们读取数据

    • 我们试着读取下文件
    
            ServletInputStream inputStream = request.getInputStream();
    
            byte[] bytes = new byte[1024];
            int len = 0;
    
            while ((len = inputStream.read(bytes)) > 0) {
                System.out.println(new String(bytes, 0, len));
            }
    
    • 在jsp页面多增添一个input控件
    
    <input type="text" name="password">
    
    • 我上传的文本文件内容就是111111,读取效果如下:

    这里写图片描述

    现在我们能够读取上传文件的数据了,但是现在问题又来了:怎么把文件上传个数据和普通传送给服务器的数据分割开来呢???上面在图上我们已经看到了,他们是混合在一起的。

    按我们平常的做法是很难分割开来的,所以我们需要上传组件


    上传组件有两种

    • FileUpload【操作比较复杂】
    • SamrtUpload【操作比较简单】

    FileUpload

    要使用FileUpload组件,就需要导入两个jar包

    • commons-io
    • Commons-fileupload

    开发步骤

    • 创建解析器工厂对象【DiskFileItemFactory】
    • 通过解析器工厂创建解析器【ServletFileUpload】
    • 调用解析器方法解析request对象,得到所有上传的内容【list】
    • 遍历list,判断每个对象是否是上传文件
      • 如果是普通表单字段,得到字段名和字段值
      • 如果是上传文件,调用InputSteam方法得到输入流,读取上传的数据

    快速入门

    
    
            try{
    
                //1.得到解析器工厂
                DiskFileItemFactory factory = new DiskFileItemFactory();
    
                //2.得到解析器
                ServletFileUpload upload = new ServletFileUpload(factory);
    
                //3.判断上传表单的类型
                if(!upload.isMultipartContent(request)){
                    //上传表单为普通表单,则按照传统方式获取数据即可
                    return;
                }
    
                //为上传表单,则调用解析器解析上传数据
                List<FileItem> list = upload.parseRequest(request);  //FileItem
    
                //遍历list,得到用于封装第一个上传输入项数据fileItem对象
                for(FileItem item : list){
    
                    if(item.isFormField()){
                        //得到的是普通输入项
                        String name = item.getFieldName();  //得到输入项的名称
                        String value = item.getString();
                        System.out.println(name + "=" + value);
                    }else{
                        //得到上传输入项
                        String filename = item.getName();  //得到上传文件名  C:\Documents and Settings\ThinkPad\桌面\1.txt
                        filename = filename.substring(filename.lastIndexOf("\\")+1);
                        InputStream in = item.getInputStream();   //得到上传数据
                        int len = 0;
                        byte buffer[]= new byte[1024];
    
    
                        String savepath = this.getServletContext().getRealPath("/upload");
                        FileOutputStream out = new FileOutputStream(savepath + "\\" + filename);  //向upload目录中写入文件
                        while((len=in.read(buffer))>0){
                            out.write(buffer, 0, len);
                        }
    
                        in.close();
                        out.close();
                    }
                }
    
            }catch (Exception e) {
                e.printStackTrace();
            }

    测试

    • 普通的字段和上传的文件都能读取得到了!

    这里写图片描述


    SmartUpload

    要使用SmartUpload组件,就需要导入smartupload.jar开发包

    快速入门

    
    
            //实例化组件
            SmartUpload smartUpload = new SmartUpload();
    
            //初始化上传操作
            smartUpload.initialize(this.getServletConfig(), request, response);
    
    
            try {
    
                //上传准备
                smartUpload.upload();
    
                //对于普通数据,单纯到request对象是无法获取得到提交参数的。也是需要依赖smartUpload
                String password = smartUpload.getRequest().getParameter("password");
                System.out.println(password);
    
                //上传到uploadFile文件夹中
                smartUpload.save("uploadFile");
    
    
            } catch (SmartUploadException e) {
                e.printStackTrace();
            }
    

    测试

    同样地,我们可以上传文件到uploadFile文件夹中。代码量也的确减少很多!

    也能够获取普通字段的参数

    这里写图片描述


    上传文件名的中文乱码和上传数据的中文乱码

    • 我把文件名改成中文,就乱码了

    这里写图片描述

    • 表单提交过来的中文数据也乱码了

    这里写图片描述

    上面已经说了,上传文件的数据的表单进行了二进制封装,所以使用request对数据编码编码,对于表单提交过来的数据是不奏效的!

    FileUpload解决乱码

    使用FileUpload解决乱码问题是十分简单的

    • 解决中文文件名乱码,得到解析器以后,就直接设置解析器的编码为UTF-8就行了!
    
    
            //设置upload的编码
            fileUpload.setHeaderEncoding("UTF-8");
    
    • 解决表单数据乱码,在获取表单值的时候,按照UTF-8编码来获取
    
       String value = fileItem.getString("UTF-8");

    效果:

    这里写图片描述


    SmartUpload解决乱码

    这个组件解决乱码问题有点麻烦,在网上找了各种办法也没找到简单的……

    所以,如果数据不涉及到中文就使用SmartUpload组件,涉及到中文数据就使用FileUpload组件吧!


    多个文件上传,动态添加上传控件

    假设我现在有多个文件要上传,而且要上传的个数是不确定的。那么我们要怎么办呢???

    我们不可能列出很多很多个上传文件的控件在页面上,这样不美观。如果用户用不到那么多个控件,也浪费呀。

    所以,我们想要动态地增添上传文件的控件,如果用户还想要上传文件,只需要动态地生成控件出来即可!

    分析

    要想在页面上动态地生成控件,无非就是使用JavaScript代码。

    那么我们要怎么做呢??

    这样子吧:当用户想要上传文件的时候,就点击按钮,按钮绑定事件,生成文件上传的控件

    为了做得更加完善,每当生成了文件上传的控件,也提供一个删除按钮,删除该控件!

    我们应该使用div装载着我们要生成的控件和删除按钮,而用户点击删除的时候,应该是要把删除按钮和文件上传控件都一起隐藏起来的。所以,最好就是使用嵌套div

    代码

    • 页面代码:
    
    
    <table border="1px">
    
        <tr>
            <td>上传用户:</td>
            <td><input type="text" name="username"></td>
        </tr>
    
        <tr>
            <td>添加上传文件</td>
            <td><input type="button" value="添加上传文件" onclick="addUploadFile()"> </td>
        </tr>
    
        <tr>
    
            <td>
                <div id="file">
                </div>
            </td>
        </tr>
    
    </table>
    
    • javaScript代码
    
        <script type="text/javascript">
    
            function addUploadFile() {
    
                //生成文件上传控件
                var input = document.createElement("input");
                input.type = 'file';
                input.name = 'fileName';
    
    
                //生成删除按钮
                var del = document.createElement("input");
                del.type = 'button';
                del.value = '删除';
    
                //生成内部的div
                var innerDiv = document.createElement("div");
    
                //将两个控件绑定到内部div上
                innerDiv.appendChild(input);
                innerDiv.appendChild(del);
    
                //得到外部div控件,并将内部div绑定到外部div上
                var outterDiv = document.getElementById("file");
                outterDiv.appendChild(innerDiv);
    
                //为删除按钮绑定事件
                del.onclick = function dele() {
    
                    //调用外界div的remove方法把内部的div干掉
                    this.parentNode.parentNode.removeChild(this.parentNode);
                }
    
            }
    
        </script>
    

    文件上传细节

    • 如果上传文件的大小大于我们设定文件的大小,那么文件在上传的时候会使用临时文件保存上传数据。在上传完毕后,我们应该删除临时文件
    • 上传文件的位置是不能在WEB服务器管理之下的,否则可能造成安全问题【其他人有可能通过手段来修改上传文件】
    • 如果上传文件名相同,那么就会把原本的上传文件覆盖掉。我们要生成一个独一无二的文件名。
    • 如果用户量很大,上传文件非常多。那么我们不应该在一个目录保存所有的上传文件,这样很可能造成磁盘奔溃了。所以我们要把上传的文件打散到不同的目录下

    分析

    删除临时文件问题是非常简单的,只需要在所有的操作完毕之后,调用FileItem的delete()方法即可

    让上传文件的位置不能在WEB服务器管理之下,我们把上传文件的位置放到WEB-INF/目录下即可!

    文件名相同的问题,我们可以使用UUID+用户上传的文件名来作为我们保存上传文件名。这样的文件名就是独一无二的了。

    要将上传的文件进行打散,那么我们需要使用HashCode算法来进行打散

    • 低四位生成一级目录
    • 5-8位生成二级目录

    代码

    下面我们写一个比较完善的上传文件代码

    • 使用hashCode算法来打散保存的目录
    
        private String makeDirPath(String fileName, String path) {
    
            //通过文件名来算出一级目录和二级目录
            int hashCode = fileName.hashCode();
            int dir1 = hashCode & 0xf;
            int dir2 = (hashCode & 0xf0) >> 4;
    
            String dir = path + "\\" + dir1 + "\\" + dir2;
    
            //如果该目录不存在,就创建目录
            File file = new File(dir);
            if (!file.exists()) {
    
                file.mkdirs();
            }
            //返回全路径
            return dir;
    
        }
    
    
    • 生成独一无二的文件名
    
    
        private String makeFileName(String fileName) {
    
            //使用下划线把UUID和文件名分割开来,后面可能会解析文件名的。
            return UUID.randomUUID().toString() + "_"+ fileName;
    
        }
    • 上传的代码
    
    
            //创建工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
    
            //通过工厂创建解析器
            ServletFileUpload fileUpload = new ServletFileUpload(factory);
    
            //设置upload的编码
            fileUpload.setHeaderEncoding("UTF-8");
    
            //判断上传表单的类型
            if(!fileUpload.isMultipartContent(request)){
                //上传表单为普通表单,则按照传统方式获取数据即可
                return;
            }
    
            try {
    
                //解析request对象,得到List【装载着上传的全部内容】
                List<FileItem> list = fileUpload.parseRequest(request);
    
                //遍历List,判断装载的内容是普通字段还是上传文件
                for (FileItem fileItem : list) {
    
                    //如果是普通输入项
                    if (fileItem.isFormField()) {
    
                        //得到输入项的名称和值
                        String name = fileItem.getFieldName();
                        String value = fileItem.getString("UTF-8");
    
                        System.out.println(name + " = " + value);
                    } else {
    
                        //如果是上传文件
    
                        //得到上传名称【包括路径名】
                        String fileName = fileItem.getName();
    
                        //截取文件名
                        fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
    
                        //生成独一无二的文件名
                        fileName = makeFileName(fileName);
    
                        InputStream inputStream = fileItem.getInputStream();
    
                        //得到项目的路径,把上传文件写到项目中
                        String path = this.getServletContext().getRealPath("/WEB-INF/uploadFile");
    
                        //得到分散后的目录路径
                        String realPath = makeDirPath(fileName, path);
    
                        FileOutputStream outputStream = new FileOutputStream(realPath + "\\" + fileName);
    
                        byte[] bytes = new byte[1024];
                        int len = 0;
                        while ((len = inputStream.read(bytes)) > 0) {
                            outputStream.write(bytes, 0, len);
                        }
    
                        inputStream.close();
                        outputStream.close();
    
                        //删除临时文件的数据
                        fileItem.delete();
    
                    }
                }
    
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
    

    效果:

    • 成功把目录打散,文件名也是独一无二的了。

    这里写图片描述


    列出上传目录下的文件,提供下载

    在讲解respose对象的时候已经讲解过文件下载了。这次我们就直接写一个小案例来巩固文件下载把。

    • 上传目录下的文件有3个

    这里写图片描述

    分析

    首先,要把目录下的文件都列出来。由于后面要根据文件名对文件进行下载,所以我们用一个Map集合来保存所有的文件

    下载文件部分也很简单,根据文件名和上传文件位置找到对应的文件,对其进行读写,然后修改消息头实现下载就好了。

    代码

    • 将存放在WEB-INF/目录下的文件全部放在Map集合中
    
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
            //得到上传文件的目录
            String filePath = this.getServletContext().getRealPath("/WEB-INF/uploadFile");
    
            Map map = new HashMap();
    
            //使用递归来得到所有的文件,并添加到Map集合中
            getAllFiles(new File(filePath), map);
    
            request.setAttribute("map", map);
            request.getRequestDispatcher("/listFile.jsp").forward(request, response);
    
    
    
        }
    
        private void getAllFiles(File filePath, Map map) {
    
            //如果不是文件,那么它就是文件夹
            if (!filePath.isFile()) {
    
                //列出文件夹下所有的文件(可能是文件,可能是文件夹)
                File[] files = filePath.listFiles();
                for (File file : files) {
    
                    //得到的文件(或者是文件夹)再对其进行判断
                    getAllFiles(file, map);
                }
            } else {
                //进入到else语句了,肯定是文件了
    
                //得到文件名
                String fileName = filePath.getName().substring(filePath.getName().lastIndexOf("_") + 1);
    
                //我们将文件全名作为key,文件名作为value保存在map集合中
                map.put(filePath.getName(), fileName);
    
            }
    
        }
    
    • 在JSP页面中显示可以下载的文件
    
    
    
    <c:forEach items="${map}" var="me">
    
        <c:url var="url" value="/DownFileServlet">
            <c:param name="fileName" value="${me.key}"></c:param>
        </c:url>
        ${me.value}<a href="${url}">下载!</a><br>
    
    </c:forEach>
    • 实现下载的Servlet
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //得到文件的全名
            String fileName = request.getParameter("fileName");
    
            //如果是中文数据,需要转码。
            fileName = new String(fileName.getBytes("ISO8859-1"), "utf-8");
    
            //得到保存文件的位置
            String path = this.getServletContext().getRealPath("/WEB-INF/uploadFile");
    
            //文件是通过文件名进行hashCode打散保存的,通过文件名拿到文件绝对路径
            String fileRealPath = makeFilePath(fileName, path);
            System.out.println(fileRealPath);
    
            //判断文件是否存在
            File file = new File(fileRealPath);
            if (!file.exists()) {
                request.setAttribute("message", "您要下载的资源不存在了!");
                request.getRequestDispatcher("/message.jsp").forward(request, response);
                return ;
            }
    
            //存在
    
            //读取该文件并把数据写给浏览器
            FileInputStream inputStream = new FileInputStream(fileRealPath);
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = inputStream.read(bytes)) > 0) {
                response.getOutputStream().write(bytes, 0, len);
            }
    
            inputStream.close();
    
    
            //设置消息头,告诉浏览器,这是下载的文件
            String name = fileName.substring(fileName.lastIndexOf("_") + 1);
            response.setHeader("content-disposition","attachment;filename=" + URLEncoder.encode(name, "UTF-8"));
    
        }
    
        private String makeFilePath(String fileName, String path) {
    
            int hashCode = fileName.hashCode();
    
            int dir1 = hashCode & 0xf;
            int dir2 = (hashCode & 0xf0) >> 4;
    
            String dir = path + "\\" + dir1 + "\\" + dir2 +"\\"+ fileName;
            return dir;
        }
    

    效果

    这里写图片描述

    展开全文
  • SpringMvc文件上传和下载

    万次阅读 多人点赞 2016-08-23 13:46:17
    最近博主在做SpringMvc文件上传和下载的功能实现,上网查了很多资料很多都不太符合理想,找啊找,终于找到一个可以用的,然后再此基础上,我加以改进,可以支持多文件上传,而且代码非常精简,大家可以看看.  ...

    最近博主在做SpringMvc文件上传和下载的功能实现,上网查了很多资料很多都不太符合理想,找啊找,终于找到一个可以用的,然后再此基础上,我加以改进,可以支持多文件上传,而且代码非常精简,大家可以看看.

              http://pan.baidu.com/s/1o7Oo4NC 原码下载

    首先需要导入jar包:

    然后,在applicatinContext.xml中添加上传和下载的配置文件,如下:

     <!-- 文件上传的配置 -->
    	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">   
            <!-- 指定所上传文件的总大小不能超过200KB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->   
            <property name="maxUploadSize" value="200000"/>   
        </bean>   
          
        <!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 -->   
        <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">   
            <property name="exceptionMappings">   
                <props>   
                    <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到WebContent目录下的error.jsp页面 -->   
                    <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error</prop>   
                </props>   
            </property>   
        </bean>

    好了,最基础的配置就好了,接下来jsp页面:upload.jsp

     

    <form action="upload.do" method="post" enctype="multipart/form-data">
             文件1: <input type="file" name="myfiles"/><br/>   
              文件2: <input type="file" name="myfiles"/><br/>   
              文件3: <input type="file" name="myfiles"/><br/>   
       		<input type="submit" value="上传">
    </form>

    Controller中对应的java代码:

    	@RequestMapping("/upload.do")
    	public String upload(@RequestParam MultipartFile[] myfiles, HttpServletRequest request) throws IOException {
    		for (MultipartFile file : myfiles) {
    			// 此处MultipartFile[]表明是多文件,如果是单文件MultipartFile就行了
    			if (file.isEmpty()) {
    				System.out.println("文件未上传!");
    			} else {
    				// 得到上传的文件名
    				String fileName = file.getOriginalFilename();
    				// 得到服务器项目发布运行所在地址
    				String path1 = request.getSession().getServletContext().getRealPath("image") + File.separator;
    				// 此处未使用UUID来生成唯一标识,用日期做为标识
    				String path = path1 + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + fileName;
    				// 查看文件上传路径,方便查找
    				System.out.println(path);
    				// 把文件上传至path的路径
    				File localFile = new File(path);
    				file.transferTo(localFile);
    			}
    		}
    		return "uploadSuccess";
    	}

    这样就可以把网页上选择的图片上传上去了

     

     

    下载成功了!

     

    文件下载

    (文件下载我是参照网上一位前辈的,在此注明他的博客网址:http://my.oschina.net/u/1394615/blog/311307):

    download.jsp:此处为了测试,我直接把文件名当作参数传过去:

    <a href="download.do?fileName=2016082312271111111.jpg">下载</a> 

    Controller:

     

    	@RequestMapping("/download")
    	public String download(String fileName, HttpServletRequest request, HttpServletResponse response) {
    		response.setCharacterEncoding("utf-8");
    		response.setContentType("multipart/form-data");
    		response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
    		try {
    			String path = request.getSession().getServletContext().getRealPath("image") + File.separator;
    			InputStream inputStream = new FileInputStream(new File(path + fileName));
    
    			OutputStream os = response.getOutputStream();
    			byte[] b = new byte[2048];
    			int length;
    			while ((length = inputStream.read(b)) > 0) {
    				os.write(b, 0, length);
    			}
    
    			// 这里主要关闭。
    			os.close();
    
    			inputStream.close();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		// 返回值要注意,要不然就出现下面这句错误!
    		// java+getOutputStream() has already been called for this response
    		return null;
    	}


    OK,springmvc的上传下载就完成了!

     

    展开全文
  • 文档包含,怎么文件上传和下载,步骤详细代码都有,文件上传表单以及代码 文件上传servlet以及代码 展示上传文件以及代码
  • Spring-boot的文件上传和下载

    万次阅读 多人点赞 2019-02-11 11:54:13
    文件上传和下载是所有后端程序员会经常用到的操作,最近学习了javaspring-boot以后就想着动手做一个文件上传和下载的demo示例出来, 先创建一个spring-boot项目,创建成功以后的目录如下: 在这里,我创建了一...

    文件的上传和下载是所有后端程序员会经常用到的操作,最近学习了java和spring-boot以后就想着动手做一个文件上传和下载的demo示例出来,
    先创建一个spring-boot项目,创建成功以后的目录如下:
    在这里插入图片描述
    在这里,我创建了一个控制器的包,里边包含了一个名为FileController.java的类,专门用于存放文件相关操作的。
    首先来做文件上传。
    先创建一个upload的html文件,代码如下:

    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8"> 
    	<title>文件上传和下载</title>
    </head>
    <body>
    <form action='http://localhost:8080/file/upload' method='post' enctype='multipart/form-data'>
    	<input type='file' name='file'>
    	<button type='submit'>上传</button>
    </form>
    </body>
    </html>
    

    接下来是webjava的内容了。

    @Controller
    @RequestMapping("/file/")
    public class FileController {
    	@RequestMapping("upload")
    	@ResponseBody
    	public String upload (@RequestParam("file") MultipartFile file) {
    		// 获取原始名字
    		String fileName = file.getOriginalFilename();
    		// 获取后缀名
    		// String suffixName = fileName.substring(fileName.lastIndexOf("."));
    		// 文件保存路径
    		String filePath = "d:/upload/";
    		// 文件重命名,防止重复
    		fileName = filePath + UUID.randomUUID() + fileName;
    		// 文件对象
    		File dest = new File(fileName);
    		// 判断路径是否存在,如果不存在则创建
    		if(!dest.getParentFile().exists()) {
    			dest.getParentFile().mkdirs();
    		}
    		try {
    			// 保存到服务器中
    			file.transferTo(dest);
    			return "上传成功";
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return "上传失败";
    	}
    }
    

    运行起来吧,我们会发现页面上提示上传成功,并且在电脑的d:/upload/中存在一个我们刚刚上传的文件,文件上传就做好了,是不是很简单。
    在这里插入图片描述
    接下来就是文件下载了,这个时候不再需要创建html文件了,我们可以直接输入网址进行下载,我们来看看核心代码,也是非常简单的。

    @RequestMapping("download")
    	public void download(HttpServletResponse response) throws Exception {
    		// 文件地址,真实环境是存放在数据库中的
    		File file = new File("D:\\upload\\a.txt");
    		// 穿件输入对象
    		FileInputStream fis = new FileInputStream(file);
    		// 设置相关格式
    		response.setContentType("application/force-download");
    		// 设置下载后的文件名以及header
    		response.addHeader("Content-disposition", "attachment;fileName=" + "a.txt");
    		// 创建输出对象
    		OutputStream os = response.getOutputStream();
    		// 常规操作
    		byte[] buf = new byte[1024];
    		int len = 0;
    		while((len = fis.read(buf)) != -1) {
    			os.write(buf, 0, len);
    		}
    		fis.close();
    	}
    

    运行起来,当我们在浏览器的地址栏中输入http://localhost:8080/file/upload时会发现,文件下载了,文件名为a.txt,即response.addHeader(“Content-disposition”, “attachment;fileName=” + “a.txt”);最后的这个文件名,这个可以自定义。
    本次分享就到这里,如有纰漏,敬请指正。

    展开全文
  • 1、android 手机文件上传下载 2、XAMPP搭建后端服务器 3、rar包内包含XAMPP搭建的详细文档 4、利用AsyncHttpClient实现图片的上传与下载
  • Django文件上传和下载

    千次阅读 2017-08-20 22:02:05
    Django文件上传和下载

    对于Web应用,经常需要实现文件的上传和下载,今天就来介绍一下使用Django如何实现文件的上传和下载。


    先来创建一个Django项目,名称为FileService:

    django-admin startproject FileService


    创建应用fileoperation

    python3 manage.py startapp fileoperation


    在项目的FileService/settings.py中的INSTALLED_APPS中添加fileoperation应用

    INSTALLED_APPS = [

        ......

        'fileoperation',

    ]


    在项目的fileoperation/目录下创建目录templates目录,用于放置模板,创建模板home.html

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>上传下载</title>
    </head>
    <body>
        <form action="{% url 'upload'%}" enctype="multipart/form-data" method="post">
            {% csrf_token %}
            <input type="file" name="filename" value="">
            <input type="submit" value="上传">
        </form>
    
        <ul>
            {% for file in files %}
                <li><a href="{% url 'download' file %}">{{ file }}</a></li>
            {% endfor %}
        </ul>
    </body>
    </html>

    模板很简单,主要是实现了一个enctype为multipart/form-data的form,将表单提交到upload请求,然后页面会显示当前已经上传的文件,点击条目,可以进行文件下载,这样我们就可以通过页面进行上传和下载了。


    配置FileService/urls.py文件,这里为了简便,我没有将url配置在fileoperation目录下的urls.py,而是直接使用fileoperation包下的views.py。

    from django.conf.urls import url
    from fileoperation import views
    
    urlpatterns = [
        url(r'^$', views.home, name='home'),
        url(r'^upload/$', views.upload, name='upload'),
        url(r'^download/(?P<filename>.+)$', views.download, name='download'),
    ]
    

    前两个配置,如果看过之前的文章应该很好理解,这里重点看一下download请求的正则表达式,其后使用

    (?P<filename>.+)


    构建了一个带有路径参数的url,用来表示该url后会跟一个文件名,例如,如果我文件名为a.txt,则url会是

    download/a.txt


    其中a.txt会作为filename参数,赋值给我们views.download函数的filename参数,稍后就会看到。


    下面看一下fileoperation/views.py的内容,首先是import部分,其中还定义了一个全局变量,表示保存文件的路径,require_GET和require_POST是两个修饰符,用来规定对应的视图函数只能执行GET或POST请求

    from django.shortcuts import render
    from django.views.decorators.http import require_GET, require_POST
    from django.http import HttpResponse
    from django.core.files import File
    import os
    
    SAVED_FILES_DIR = r'files/'

    下面是一个函数,用来渲染home.html模板

    def render_home_template(request):
        files = os.listdir(SAVED_FILES_DIR)
        return render(request, 'home.html', {'files': files})

    home请求的视图函数

    @require_GET
    def home(request):
        if not os.path.exists(SAVED_FILES_DIR):
            os.makedirs(SAVED_FILES_DIR)
    
        return render_home_template(request)

    比较简单,判断是否存在保存文件的目录,如果不存在,创建该目录,然后渲染home.html模板。


    download视图函数

    @require_GET
    def download(request, filename):
        file_pathname = os.path.join(SAVED_FILES_DIR, filename)
    
        with open(file_pathname, 'rb') as f:
            file = File(f)
    
            response = HttpResponse(file.chunks(),
                                    content_type='APPLICATION/OCTET-STREAM')
            response['Content-Disposition'] = 'attachment; filename=' + filename
            response['Content-Length'] = os.path.getsize(file_pathname)
    
        return response

    下载流程很简单,打开需要下载的文件,filename参数就是前面url配置的路径参数,将Python的文件对象使用Django的文件对象进行包裹,然后创建HttpResponse对象,给该对象传入chunks()返回的生成器,该生成器每次生成最多64kb的文件数据,然后传输给客户端。


    上传视图函数

    @require_POST
    def upload(request):
        file = request.FILES.get("filename", None)
        if not file:
            return render_home_template(request)
    
        pathname = os.path.join(SAVED_FILES_DIR, file.name)
    
        with open(pathname, 'wb+') as destination:
            for chunk in file.chunks():
                destination.write(chunk)
    
        return render_home_template(request)

    上传的逻辑也不复杂,从request的FILES中取到filename对应的django file对象,然后创建输出文件,将django file对象的chunks写入输出文件。


    可以看到,Django实现上传和下载非常简单,代码也比较简洁,而且,使用chunks直接可以实现大文件上传,而不必担心占用过多的内存。



    展开全文
  • 华为云OBS文件上传和下载

    万次阅读 热门讨论 2019-12-30 15:31:13
    华为云Obs文件上传下载 往华为云Obs中上传下载文件 本来一开始打算把文件上传到华为云服务器中,可是服务器容量有限,所以找了一款华为云Obs对象存储服务,...文件上传下载地方是华为云Obs对象存储服务 合理的...
  • ASP实现文件上传和下载

    热门讨论 2010-04-06 13:26:39
    ASP实现文件的上传下载 ,应用组件LyfUpload.dllMengXHFileDownLoad.dll,包中包含数据库文件以及上传下载实例比较详细说明文档
  • SpringMVC05_文件上传和下载

    万次阅读 2020-06-23 23:51:51
    SpringMVC05_文件上传文件上传 upload.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page isELIgnored="false" %> <html> <head> <title>...
  • 文件上传和下载的常见测试点 上传名命名规范等 下载文件的大小,存在性等
  • xshell 文件上传和下载

    千次阅读 2017-03-28 14:46:34
    xshell 文件上传和下载 介绍两种方式:命令、工具 上传和下载参照对象是本机 命令: 1.sz  文件下载文件大小限制 4G) 2.rz 文件上传 工具: File Transfer(工具栏中有) 这个没有上面的sz文件大小的...
  • PHP文件上传和下载

    热门讨论 2013-03-06 23:33:03
    php 上传 下载
  • 在TCP/IP中,我们知道最早的上传机制为FTP,它是指将文件由客户端发送到服务器的标准机制。然而我们在jsp编程中不能使用FTP来上传文件,这是由于jsp运行机制决定的。  文件上传原理  表单提交->二进制编码->...
  • SSH实现文件上传和下载

    热门讨论 2008-11-25 10:32:27
    SSH实现文件上传和下载。。。。。。。。。。。。
  • django文件上传和下载的介绍

    千次阅读 2016-07-25 17:25:42
    django中的文件上传和下载
  • Java真实项目中的文件上传和下载代码及数据库。 Java真实项目中的文件上传和下载代码及数据库。
  • 最近的项目中用到了文件的上传下载功能,任务分配给了其他的...maven导包及配置pom.xml,导包时除开springmvc的基础依赖外,需要导入文件上传下载时用到的commons-io.jsrcommons-fileupload.jar: <project xmlns
  • 在java代码中实现文件上传和下载,通过页面的file文件上传到java代码段,获取文件的大小名字
  • 文件上传和下载的JavaBean组件

    千次阅读 2014-09-17 19:05:19
    (1)JspSmartUpload是一个免费的上传下载文件的JavaBean,比较适合小文件上传下载。 smartUpload中常用的类如下: 无标题文档 SmartUpload upload=new ...
  • 使用QT实现文件上传和下载----ftp服务器

    千次下载 热门讨论 2014-07-16 17:07:49
    使用QT实现文件上传和下载,服务器为FTP服务器,这是一个简单的测试源码。希望能够给初学者一定的启发。
  • Servlet实现文件上传和下载

    万次阅读 多人点赞 2018-09-13 11:17:03
    文件上传 表单的设置 设置表单的enctype,提交方式必须为post &amp;lt;form action=&quot;up&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&...
  • 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet...
  • 那么今天将对ftp实现文件上传和下载进行一个使用总结,关于ftp这方面的理论知识如果不是太了解的各位道友,那么请移步HTTPFTP的区别的一些理论知识 作个具体的了解或者查阅相关资料。那么先看看个人工作项目这个...
  • SpringMVC(4) 文件上传和下载

    万次阅读 2018-10-25 23:10:41
    点击下载项目资源 密码:1k9z 前端页面: 上传文件注意事项:①post提交数据 ②form表单 --> enctype属性为:multipart/form-data ③使用上传文件的file标签 <!DOCTYPE html> &...
  • 接上一篇,文件下载需要获取下载文件的存储路径,这里只是手动填入,如果是在具体项目中,可以把文件名和上传后的存储路径保存在数据库中。然后增加一个文件列表的页面展示文件名和文件路径,然后点击下载的时候把...
  • 刚好最近有一个上传文件的工作呢,刚好就想起这个脚手架,将文件上传和下载整理进来。 配置 在application.properties 中增加上传文件存放的路径配置 #文件上传目录 file.upload.url=E:/test controlle...
  • Qt5.8用FTP实现文件上传和下载(带进度条)

    万次阅读 多人点赞 2017-08-25 15:45:10
    Qt5.8用FTP实现文件上传和下载(带进度条)本文基于Qt5.8利用FTP协议实现文件上传和下载。 本人所使用的FTP服务器端的操作系统为Linux(Ubuntu),编写QT代码的客户端的操作系统为Windows - 1. UI界面 - 2. 修改....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 650,899
精华内容 260,359
关键字:

文件上传和下载