Java文件上传细讲,大厂 HR 如何面试

Sourcetree与Gitee的搭配使用 初次将gitee与sourcetree联合起来使用,还是遇到了不少问题,其中最让人烦恼的就是在我修改了一下用户名之后,便无法在Sourcetree直接推送到gitee,很是让人郁闷。本文处理Sourcetree与gitee搭配使用过程中的问题:Sourcetree身份验证失败,无法推送;Sourcetree推送时,无法显示要推送的分支;Sourcetree远端上面有感叹号。 阅读详情


写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。扫码加微信好友进【程序员面试学习交流群】,免费领取。也欢迎各位一起在群里探讨技术。

 

什么是文件上传?

 

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

为什么需要文件上传?

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

上传组件(工具)

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

为啥我们需要上传组件呢?当我们要获取客户端的数据,我们一般是通过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 SettingsThinkPad桌面.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集合来保存所有的文件

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




  •  
  • 得到装载上传文件的路径,通过递归把所有的文件都查找出来(判断是否是文件就是递归出口),装载到Map集合中


     
  • 将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;

    }

效果

这里写图片描述

 

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章的同学,可以关注微信公众号:Java3y


 

 


转载:https://www.cnblogs.com/Java3y/p/8428591.html

推荐内容:
JAVA工程师面试题库
为什么说 Java 程序员到了必须掌握 Spring Boot 的时候?
2018年Java后端面试经历
100道Java基础面试题
Java入门篇(一)——如何编写一个简单的Java程序
Java面试经
金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇
以技术面试官的经验分享毕业生和初级程序员通过面试的技巧(Java后端方向)
java面试官如何面试别人
Java面试题总结-Day3

 

S7-1200PLC 与温控仪表Modbus RTU通信 硬件:cpu 1214C 目的:通过Modbus RTU协议,实现对温控仪表的控制 软件:Portal V14SP1 阅读详情

相关推荐

海康/大华设备如何接入GB28181平台?最新2022版互联避坑指南

本文详细解析了海康/大华设备接入GB28181平台的最新2022版互联避坑指南,涵盖参数配置、实时视音频点播协议交互及典型故障排查。重点介绍了GB/T28181-2022标准下的设备编码规范、SIP服务器配置及媒体流保活机制,帮助工程团队高效解决设备离线和媒体流中断等问题。

weixin_30733003的博客 686

文件上传和下载

什么是文件上传? 文件上传就是把用户的信息保存起来。 为什么需要文件上传? 在用户注册的时候,可能需要用户提交照片。那么这张照片就应该要进行保存。 上传组件(工具) 为什么我们要使用上传工具? 为啥我们需要上传组件呢?当我们要获取客户端的数据,我们一般是通过getParameter()方法来获取的。 上传文件数据是经过MIME协议进行分割的,表单进行了二进制封装。也就是...

3y 868

6种常用数据分析方法详解:从描述统计到时间序列

数据分析是连接数据与业务决策的桥梁。面对海量数据,掌握描述性统计与对比分析可快速了解现状与差距;相关分析与回归分析能揭示变量间的关联与影响大小;聚类分析用于用户分群,时间序列分析则预测未来走势。这些方法广泛应用于用户画像、销量预测、活动效果评估等场景,是数据分析师和运营人员必备的技能。系统掌握这6种核心方法的使用场景、原理逻辑与实操步骤,能够帮助读者建立完整分析框架,真正用数据驱动业务增长。

weixin_34405354的博客 335

傲拓PLC,NApro程序上载说明

注意:如果之前在的程序设置未勾选允许程序上载,便不能上载任何东西!上载成功后显示如下提示,并点击保存编译按钮进行项目编译。2)填写要上载的PLC IP地址。3)填写要上载的文件名称后点击确定。选择第一步创建的文件夹,并填写文件名后点击保存。第三步:1)点击菜单栏下载按钮,选择上载全部。第二步:打开NAPro编程软件,新建项目。第一步:在桌面新建空白文件夹。

weixin_44281509的博客 1024

用Python搞定超效率SBM模型:从数据清洗到结果可视化全流程指南

本文详细介绍了如何使用Python实现超效率SBM模型,从数据清洗到结果可视化的全流程指南。超效率SBM模型作为传统DEA的进化版本,能有效处理非期望产出(如环境污染)并对高效单元进行精细排序。通过实战案例和代码示例,帮助读者掌握这一先进模型的Python实现技巧,提升效率评估的准确性和可视化效果。

silver的专栏 650

如何在OBS中添加实时时间戳:Lua脚本配置教程(附效果展示)

本文详细介绍了如何在OBS中通过Lua脚本配置实时时间戳功能,包括环境准备、脚本获取、安装配置及高级定制。适用于直播和视频录制场景,提供精准回溯和风格自定义,支持多平台适配和性能优化,是专业制作的必备技巧。

day7的博客 1044

记录一次图片上传(非SpringMVC)

记录一次图片上传 一、提前准备 1、需要知道 一般进行图片上传处理的时候,将图片保存到oss中,路径保存到数据库,使用的时候调用路径即可 前端代码: 在java中使用form表单上传文件时form标签中必须加上 enctype=“multipart/form-data” enctype: 规定在发送到服务器之前应该如何对表单数据进行编码。 enctype的三个参数: |- application/x-www-form-urlencoded: 在发送前编码所有字符(默认) |- multipart/fo

Mr_QinHongXin的博客 336

深入解析进化算法中的选择与多样性

在计算科学的世界里,最优雅的解决方案往往源于最古老的智慧——大自然。进化算法(Evolutionary Algorithms, EAs)正是这样一种受达尔文自然选择学说启发的强大工具。它们通过模拟“适者生存”的过程,在庞大的可能性海洋中搜寻最优解。。:指的是深入挖掘和优化已知的优质解。这就像在一片已知的沃土上精耕细作,力求获得最高产量。强大的选择压力会促进这一过程。:指的是在整个搜索空间中寻找全新的、可能更优的解。这好比派遣探险队去发现新大陆,充满了未知与机遇。保持种群的多样性是探索的关键。

weixin_62533513的博客 716

SpringMVC教程(十一)

SpringMVC:文件上传和下载 2019-10-19/Java/狂神说位置:Home»Java»本页 准备工作 ​ 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配...

qq_39825574的博客 584

基于MATLAB的鲁棒主成分分析(Robust PCA)图像去噪

鲁棒主成分分析(Robust PCA)是一种有效的图像去噪方法,它能够在保持图像细节的同时去除噪声。本文将介绍如何使用MATLAB实现基于鲁棒PCA的图像去噪,并提供相应的源代码。它假设噪声是随机的、高斯分布的,并将图像分解为一个低秩矩阵和一个稀疏矩阵的和。低秩矩阵表示图像的结构和纹理信息,稀疏矩阵表示图像中的噪声和细节信息。接下来,我们将图像矩阵减去均值,得到规范化的图像矩阵。然后,我们将灰度图像转换为矩阵形式,并计算图像的均值。通过分离出低秩矩阵和稀疏矩阵,我们就得到了去噪后的图像和残差图像。

DevRevolt的博客 1125

微信小程序开发:实现地图导航功能

其中,id用于调用地图组件,latitude和longitude表示地图的中心点坐标,markers表示地图中的标记点,covers表示地图中的覆盖物,polyline表示地图中的折线图,show-location表示是否显示当前定位点,bindregionchange表示移动地图时触发的事件。其中,id表示标记点的唯一标识,latitude和longitude表示标记点的坐标,title表示标记点的名称,iconPath表示标记点的图标路径,width和height表示标记点的宽度和高度。

吃不胖. 8919

Java 文件上传 三种方式

一:配置springBoot上传文件限制 spring: servlet: multipart: max-file-size: 100MB #单个文件大小 max-request-size: 1024MB #总文件大小 二:代码 import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.spri

qq_50990903的博客 2万+

利用 Python 构建高效爬虫爬取国家标准文献——从基础到进阶

然而,由于许多标准文献需要从特定网站获取,手动下载既耗时又低效,因此构建自动化爬虫成为一种实用且高效的解决方案。本文从技术选型、网站分析、代码实现到反爬优化,全面讲解了如何爬取国家标准文献。国家标准文献(National Standards Literature)是国家对各领域统一规范的文件,涵盖了技术参数、测试方法、生产工艺等内容。因此,通过自动化爬虫技术进行文献爬取和管理,不仅能解放劳动力,还可以提高数据管理效率。在构建爬虫前,我们需要对目标网站进行分析,包括页面结构、请求方式以及可能的反爬机制。

2201_76125261的博客 2104

使用JAVA文件上传的几种方式,2面技术+HR面+offer

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考以下是部分内容截图网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)一个人可以走的很快,但一群人才能走的更远!

2401_84439805的博客 858

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

2025年渗透测试面试题总结-匿名[实习]安全工程师(大厂) (3)(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。

soc的博客 1086

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java通过流实现文件上传下载,最全的BAT大厂面试题整理

前言 消息中间件是分布式系统中的重要组件,在实际工作中常用消息中间件进行系统间数据交换,从而解决应用解耦、异步消息、流量削峰等问题,实现高性能、高可用、可伸缩和最终一致性架构。目前市面上可供选择的消息中间件有RabbitMQ、ActiveMQ、 Kafka、 RocketMQ、ZeroMQ、MetaMQ等。 本文总结了近年来在实际项目中使用消息中间件的经历和踩过的一些坑,可为你**在实际工作中进行产品选型、业务场景方案制定、性能调整等提供明确的思路。**由于是基于Java语言开发,因此它非常适合Java初中

m0_57501637的博客 472

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

从.Net到Java学习第一篇——开篇,大厂 HR 如何面试

写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。扫码加微信好友进【程序员面试学习交流群】,免费领取。也欢迎各位一起在群里探讨技术。 以前我常说,公司用什么技术我就学什么。可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的。”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交...

ccc_ccc8的博客 493

蚂蚁金服面试经验分享,阿里的offer真的不难

很多求职者在面试过程中自己思路不清晰,语言不流畅,说话毫无逻辑,会不断否定自己,归根结底都是面试心态问题,所以调整自己的心态,正确面对得失是非常重要的,我的方法是给自己足够的心理暗示。这是很多现在面试者心中的困惑,我们都知道,面试前刷题是很有必要的,毕竟很多题目都有一定的共性,刷足够题目就能够做到举一反三,甚至在面试时,被问到原题,能够侃侃而谈,那么刷题如何进行呢?对于程序员来说,要想成长为一名行业内的大牛大神级别的人物,那么唯一的办法就是通过学习,来不断提升自己的技术,扩宽知识,达到一定的高度和深度。

2401_89308311的博客 1280

蚂蚁金服面试分享,阿里的offer真的不难,3位朋友全部offer

以下也是我整合起来的面试题,和面试经验,我希望这些能帮到大家面试这些大厂能有所帮助,其实讲白了,面试经验只是一个借鉴,不能作为具体参考,但这些经验能从重考虑大致方向,接下来说说下4面阿里面试(三面加HR面)不过阿里的确是程序员的金字塔呀,在这种地方,你会觉得自己真的如此渺小,以前引以自豪的能力,在这里面一切都像新手一样,什么 写个框架无压力的人很多,随意修改JVM无压力,数据库也是。不过值得注意的是,他们那边一般不直接回答对还是错,最终发现呢,阿里的几轮面试,都是这样,他们一般只听,偶尔追问。

jjc4261的博客 3855

SSM文件上传,BAT大厂面试基础题集合

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!片转存中…(img-I9HR5Hrt-1713389174429)]一个人可以走的很快,但一群人才能走的更远!

m0_60634964的博客 468

大厂Java面试全流程与微服务架构深度解析

微服务架构作为分布式系统的核心实现方式,通过服务拆分和独立部署提升系统弹性。其核心原理围绕注册中心、配置管理和服务通信展开,采用Spring Cloud等框架可实现服务治理。在技术价值层面,微服务显著提升开发效率与系统可扩展性,特别适合电商、金融等高并发场景。面试考察重点包括Nacos注册中心实现、OpenFeign通信机制等实战内容,同时涉及Kafka消息可靠性保障等分布式系统关键问题。掌握这些技术要点不仅能应对大厂面试,更能为构建高可用系统打下坚实基础。

weixin_30425949的博客 355

压抑了五个月的我终于可以放声呐喊了!阿里是真的难进,Java四面面经+面试题

阿里一面 没过2天就接到一个杭州的座机,说要约我进行电话面试,效率还是挺高,然后当天晚上就进行了一面。 下班后,吃了饭,专门找了一条人比较少的小路,到了7点,电话准时打过来了。 还是先来自我介绍,完了面试官就开始发问,持续了大概40分钟,感觉面的一般,答的也不知道是否准确,反正他们那边一般不直接回答对还是错,后来发现,阿里的几轮面试,都是这样,他们一般只听,偶尔追问。 不知道的直接说答不上来,就会继续一个题。 一面完了,叫我等消息,心中凉凉,很多公司,等消息基本就是没消息。 不过当时,自己心态挺

如果频繁就私信一下呢 464

Java大厂面试真题:从Spring Boot到微服务架构的三轮连环拷问

大厂面试不仅考知识点,更看重。

weixin_74238318的博客 766

2025年渗透测试面试题总结-匿名[实习]安全工程师(大厂) (2)(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。

soc的博客 1716

2024年网络安全最新2024届【校招】安全面试题和岗位总结(字节、百度、腾讯(1),2024阿里网络安全高级面试题总结

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。需要完整版PDF学习资源私我。

2401_84254087的博客 1465

阿里蚂蚁花呗团队面试题:spring+分布式+jvm+session+redis !

前言 找工作是件非常重要的事情,它直接影响你1~ 2年,间接影响你3~ 5年的人生。一个潜在 的机会会让你少奋斗很多年,而一次冲动的离职,会让你和千万财富错失交臂。 一面 没过2天就接到一个杭州的座机,说要约我进行电话面试,效率还是挺高,然后当天晚上就进行了一面。 下班后,吃了饭,专门找了一条人比较少的小路,到了7点,电话准时打过来了。 还是先来自我介绍,完了面试官就开始发问,持续了大概40分钟,...

weixin_44782075的博客 327
上一篇: java volatile详解,互联网 面试官 如何面试
下一篇: Java 文件流操作.,互联网 面试官 如何面试
agoodcoder777
博客等级 码龄8年 24粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值