文件上传的实质通俗的说就是将文件从一个地方搬运到另一个地方,这个过程我们称之为--文件上传
原理??过程引出
???输入流:是将web客户端的文件上传到内存中-------关联源文件(要存的文件)。
???输出流:将内存中的数据拿到服务器中-----------------关联目标文件(要存到什么地方)。
apache:commons-fileupload-1.2.1.jar? ?commons-io-1.4.jar
这里是上传需要的jar包工具
前端jsp页面代码:
<form action="fileup.do" enctype="multipart/form-data" method="post"> <input type="text" name="user_id"><br/> <input type="text" name="user_name"><br/> <input type="file" name="file1"><br/> <input type="submit" ?value="上传文件"><br/> </form>
注意点:get方式只能上传256字节
前端页面完成后,我们就需要写后端需要的servlet,这里命名大家尽量要规范
代码写的比较详细,适合新手去理解,包括里面的步骤,测试,注解之类的写的很清晰,可以借鉴一下
? ? ? ? ?//2.创建解析器需要的FileItemFactory工厂 ?? ??? ?DiskFileItemFactory fileItemFactory=new DiskFileItemFactory(); ?? ??? ? ? ?//1.创建解析器解析form表单中的数据,FileItemFactory解析器的运转需要它-一个工厂 ?? ??? ?ServletFileUpload sfu=new ServletFileUpload(fileItemFactory); ? ? ? ? ? ? //3.从请求中获取数据 ?? ??? ?List<FileItem> list=null; ?? ??? ? ? try { ?? ??? ??? ?//表单中的文本数据和文件都在这个list集合中. ?? ??? ??? ?list=sfu.parseRequest(request); ?? ??? ?} catch (FileUploadException e) { ?? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ??? ?//4.通过for从list中取值 ?? ??? ?for (int i = 0; i < list.size(); i++) { ?? ??? ??? ?//(1)判断是不是表单数据 ?? ??? ? ? if(list.get(i).isFormField()){ ?? ??? ??? ? ? if(list.get(i).getFieldName().equals("user_id")){ ?? ??? ??? ??? ? ? System.out.println(list.get(i).getString("utf-8")); ?? ??? ??? ? ? } ?? ??? ??? ? ? if(list.get(i).getFieldName().equals("user_name")){ ?? ??? ??? ??? ? ? System.out.println(list.get(i).getString("utf-8")); ?? ??? ??? ? ? } ?? ??? ??? ? ?? ?? ??? ? ? }else{ ?? ??? ??? ?//(2)判断是不是文件 ?? ??? ??? ?//(3)创建输入流,关联源文件 ?? ??? ??? ?/*//file里面就写文件路径 ?? ??? ??? ? ? File file=new File("C://aa"); ?? ??? ??? ? ? InputStream is=new FileInputStream(file+"//"+"//A.java");*/ ?? ??? ??? ?//(3)创建输入流,关联源文件可以直接用getInputStream进行关联 ?? ??? ??? ? ? ?InputStream is=list.get(i).getInputStream(); ?? ??? ??? ?//(4)创建输出流,关联目标文件 ?? ??? ??? ? ? File file1=new File("D://aa"); ?? ??? ??? ? ? image_path="D://aa"; ?? ??? ??? ? ? if(!file1.exists()){ ?? ??? ??? ??? ? ? file1.mkdir();//创建一个目录 ?? ??? ??? ? ? } ?? ??? ??? ? ? OutputStream os=new FileOutputStream(file1+"//"+list.get(i).getName()); ?? ??? ??? ? ? //传输文件 ?? ??? ??? ? ? //int temp=-1; ?? ??? ??? ? ? byte b[]=new byte[1024]; ?? ??? ??? ? ? while((is.read(b))!=-1){//不等于-1就说明还有文件,一直取 ?? ??? ??? ??? ? ? os.write(b);//存 ?? ??? ??? ? ? } ?? ??? ??? ? ? //传输结束,关闭资源 ?? ??? ??? ? ? os.flush();//刷新 ?? ??? ??? ? ? os.close(); ?? ??? ??? ? ? is.close(); ?? ??? ??? ? ?? ?? ??? ??? ?} ?? ??? ?}
?这里就是正常的完成结果,我们从任意地方选取文件,存到D盘中的aa文件夹中
|