SpringMVC IO 文件上传

  1 public class FileUtil {
  2 
  3 
  4     /**
  5      * 读取文件内容,作为字符串返回
  6      */
  7     public static String readFileAsString(String filePath) throws IOException {
  8         File file = new File(filePath);
  9         if (!file.exists()) {
 10             throw new FileNotFoundException(filePath);
 11         }
 12 
 13         if (file.length() > 1024 * 1024 * 1024) {
 14             throw new IOException("File is too large");
 15         }
 16 
 17         StringBuilder sb = new StringBuilder((int) (file.length()));
 18         // 创建字节输入流
 19         FileInputStream fis = new FileInputStream(filePath);
 20         // 创建一个长度为10240的Buffer
 21         byte[] bbuf = new byte[10240];
 22         // 用于保存实际读取的字节数
 23         int hasRead = 0;
 24         while ( (hasRead = fis.read(bbuf)) > 0 ) {
 25             sb.append(new String(bbuf, 0, hasRead));
 26         }
 27         fis.close();
 28         return sb.toString();
 29     }
 30 
 31     /**
 32      * 根据文件路径读取byte[] 数组
 33      */
 34     public static byte[] readFileByBytes(String filePath) throws IOException {
 35         File file = new File(filePath);
 36         if (!file.exists()) {
 37             throw new FileNotFoundException(filePath);
 38         } else {
 39             ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
 40             BufferedInputStream in = null;
 41 
 42             try {
 43                 in = new BufferedInputStream(new FileInputStream(file));
 44                 short bufSize = 1024;
 45                 byte[] buffer = new byte[bufSize];
 46                 int len1;
 47                 while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
 48                     bos.write(buffer, 0, len1);
 49                 }
 50 
 51                 byte[] var7 = bos.toByteArray();
 52                 return var7;
 53             } finally {
 54                 try {
 55                     if (in != null) {
 56                         in.close();
 57                     }
 58                 } catch (IOException var14) {
 59                     var14.printStackTrace();
 60                 }
 61 
 62                 bos.close();
 63             }
 64         }
 65     }
 66 
 67     /*
 68      * 通过流的方式上传文件
 69      * @RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
 70      * org.springframework.web.multipart.commons.CommonsMultipartFile(类)
 71      * 中间会生成临时文件,会自动删除
 72      * 效率NO.3
 73      * 稍微大的文件超时,jq.js会报10254错误,前端显示404不过文件可以上传
 74      * 需要在在dispatcher.xml里面配置试图解析器(<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">)
 75      */
 76 
 77     public static void  fileUpload1(CommonsMultipartFile file) throws IOException {
 78 //        FileItem fff=file.getFileItem();
 79 //        System.out.println(fff.getName()+"<<<<getName()>>>>");
 80 //        System.out.println(fff.getFieldName()+"<<<<getFieldName()>>>>>");    ;
 81 //        System.out.println(fff.isFormField()+"<<<<isFormField()>>>>");
 82 //        //在这里面规定上传文件的类型
 83 //        System.out.println(fff.getContentType().endsWith(".doc")+"<<<<getContentType()>>>>");
 84 //        System.out.println(fff.isInMemory()+"<<<<isInMemory()>>>>");
 85 //        System.out.println(fff.getSize()+"<<<<getSize()>>>>");
 86 
 87         //用来检测程序运行时间
 88         long  startTime=System.currentTimeMillis();
 89         if(file.isEmpty()){
 90             System.out.println("文件不存在(或大小为0)");
 91             return;
 92         }
 93         String renamePath=FileUtil.renameFile(file.getOriginalFilename());
 94         OutputStream os = null;
 95         InputStream is = null;
 96         try {
 97             //获取输出流
 98             os=new FileOutputStream(renamePath);
 99             //获取输入流 CommonsMultipartFile 中可以直接得到文件的流
100              is=file.getInputStream();
101             int temp;
102             //一个一个字节的读取并写入
103             while((temp=is.read())!=(-1))
104             {
105                 os.write(temp);
106             }
107 
108 
109         } catch (FileNotFoundException e) {
110             // TODO Auto-generated catch block
111             e.printStackTrace();
112         }finally{
113             os.flush();
114             os.close();
115             is.close();
116         }
117         long  endTime=System.currentTimeMillis();
118         System.out.println("方法一的运行时间:"+String.valueOf(endTime-startTime)+"ms");
119     }
120 
121 
122     /*
123      * 采用file.Transto 来保存上传的文件【速度最快】
124      *     org.springframework.web.multipart.commons.CommonsMultipartFile(类)
125      *中间会生成临时文件,会自动删除
126      * 效率NO.2
127      * 稍微大的文件超时,jq.js会报10254错误,前端显示404不过文件可以上传
128      *     * 需要在在dispatcher.xml里面配置试图解析器(<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">)
129 
130      */
131     public static void  fileUpload2(CommonsMultipartFile file) throws IOException {
132         if(file.isEmpty()){
133             System.out.println("文件不存在");
134             return;
135         }
136         long  startTime=System.currentTimeMillis();
137          String renameFilePath=FileUtil.renameFile(file.getOriginalFilename());
138         try{
139             File newFile=new File(renameFilePath);
140             //通过CommonsMultipartFile的方法直接写文件(注意这个时候)
141             file.transferTo(newFile);
142         }catch (Exception e){
143             System.out.println("方法2上传文件转换失败");
144         }
145 
146         long  endTime=System.currentTimeMillis();
147         System.out.println("方法二的运行时间:"+String.valueOf(endTime-startTime)+"ms");
148 
149     }
150 
151     /*推荐使用使用
152      *采用spring提供的上传文件的方法
153      * package org.springframework.web.multipart.commons.CommonsMultipartResolver;
154      * 需要在在dispatcher.xml里面配置试图解析器(<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">)
155      * 中间会生成临时文件,会自动删除
156      * 支持多文件上传
157      * 速度NO.1
158      */
159 
160     public static void  springUpload(HttpServletRequest request) throws IllegalStateException, IOException
161     {
162         long  startTime=System.currentTimeMillis();
163         //将当前上下文初始化给  CommonsMutipartResolver (多部分解析器)
164         CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(
165                 request.getSession().getServletContext());
166         //检查form中是否有enctype="multipart/form-data"
167         if(multipartResolver.isMultipart(request))
168         {
169             //将request变成多部分request
170             MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
171             //获取multiRequest 中所有的文件名
172             Iterator iter=multiRequest.getFileNames();
173 //            List<FileItem>
174             while(iter.hasNext())
175             {
176                 //一次遍历所有文件
177                 MultipartFile file=multiRequest.getFile(iter.next().toString());
178                 if(file!=null)
179                 {
180                   String renamePath=  FileUtil.renameFile(file.getOriginalFilename());
181                     //上传
182                     file.transferTo(new File(renamePath));
183                 }
184 
185             }
186 
187         }
188         long  endTime=System.currentTimeMillis();
189         System.out.println("方法三的运行时间:"+String.valueOf(endTime-startTime)+"ms");
190 
191     }
192 
193     /***基于
194      * commons-fileupload
195      *commons-io
196      *上传
197      *需要注销spring的上传文件解析器
198      * 因为protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {
199      *         String encoding = this.determineEncoding(request);
200      *         FileUpload fileUpload = this.prepareFileUpload(encoding);已经调用FileUpload进行解析封装为自己的对象MultipartParsingResult
201      *         再次List<FileItem> list = upload.parseRequest(request);解析时为空导致集合为空
202      * */
203        public static void fileUpload3(HttpServletRequest request, HttpServletResponse response){
204         //判断是不是post提交
205          boolean isMultipart =ServletFileUpload.isMultipartContent(request);
206            if (isMultipart == true) {
207                //初始化FiletItem工厂
208                FileItemFactory fif =new DiskFileItemFactory();
209                ServletFileUpload upload = new ServletFileUpload(fif);
210                upload.setHeaderEncoding("utf-8");
211                try {
212                    //解析表单请求
213                    List<FileItem> list = upload.parseRequest(request);
214                    for (FileItem fi : list) {
215                        //普通表单元素处理start
216                        if (fi.isFormField()) {//判断是不是普通变淡属性
217                            String fieldname = fi.getFieldName();
218                            if (fieldname.equals("productNmae")) {
219                                String projectName = null;
220                                try {
221                                    projectName = fi.getString("utf-8");
222                                } catch (UnsupportedEncodingException e) {
223                                    System.out.println("不支持utf-8编码");
224                                }
225                                System.out.println(projectName);
226                            } else if (fieldname.equals("file")) {
227                                try {
228                                    System.out.println(fi.getString("utf-8"));
229                                } catch (UnsupportedEncodingException e) {
230                                    System.out.println("不支持utf-8编码");
231                                }
232                                ;
233                            }
234                            //普通表单元素处理end
235                        } else {//是文件类型判断其大小,为0继续for循环
236                            if (fi.getSize() == 0) {
237                                continue;
238                            }
239                          String  newFileName =FileUtil.renameFile(fi.getName());
240                            try {
241                                fi.write(new File(newFileName));
242                            } catch (Exception e) {
243                                e.printStackTrace();
244                            }
245 
246                        }
247                    }
248                } catch (FileUploadException e) {
249                    e.printStackTrace();
250                }
251 
252            }
253 
254        }
255     /***
256      * 上传文件命名公共方法
257      * */
258     public static synchronized String renameFile(String originalFilename){
259         System.out.println("原文件名:"+originalFilename);
260         //桌面路径
261         String prefix = originalFilename.substring(originalFilename.lastIndexOf("."));
262         String newFileName =new Date().getTime()+ prefix;
263         String desktopPath= FileSystemView.getFileSystemView().getHomeDirectory().getAbsolutePath()+"\"+newFileName;
264         System.out.println("新文件名:"+newFileName);
265         return  desktopPath;
266 
267     }
268 
269 //    <!-- 多部分文件上传 -->
270 //<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
271 //     <property name="maxUploadSize" value="104857600" />
272 //     <property name="maxInMemorySize" value="4096" />
273 //     <property name="defaultEncoding" value="UTF-8"></property>
274 //</bean>
275 }
一点点学习,一丝丝进步。不懈怠,才不会被时代淘汰
原文地址:https://www.cnblogs.com/wangbiaohistory/p/11050113.html