`

有关java上传和File以及FileInputStream的区别

    博客分类:
  • JAVA
阅读更多

最近在帮助同事解决FTP上传文件时出现了奇怪的问题,本机起服务,上传本机文件一切OK,测试机起服务,客户端机器上传文件就失败,具体分析原因如下:

 

1:PostUploadInfo的js是页面<ai:fileupload标签自动加载的AIFileUpload.js里的方法

这里的ActionDocumentInfo.java注意与FtpUtilPro.java(它的一个upload方法有bug)的对比能
看出后者的bug.

 

从这个bug要看出File与FileInputStream的区别,File不属于流,它只是用来屏闭不同文件系统,用来统一
描述文件的实体BEAN,new File时给它传入文件名称或是路径,它就会去根据参数查找对应的文件属性然后封装
成实体。用来处理判断该路径是一个文件还是路径,文件或路径的权限,修改时间等等,路径的子路径list等等目录操作。

File不属于文件流,只能代表一个文件或是目录的路径名而已.

而FileInputStream关注的是文件的内容,是用来进行文件读写等操作的二进制流类。大多数情况下,构造FileInputStream
时传递一个File对象做参数,也可以直接传递String的文件路径。


这个容易混淆的问题在FTP时候很容易出现,因为客户端点击浏览本地文件后在上传时在服务器端如果直接把客户端的
文件名称拿到,然后用new File(“文件名称路径”),再用new InputStream(File)来上传到FTP的话,其实就是相当于服务器
端在服务器本地找File(“文件名称路径”),然后往FTP上传,这是错误的。我们希望的是上传客户端的文件,而不是
服务器端的文件,所以这里应该是直接用apache的FileItem.getInputStream的结果直接upload,如下:
InputStream fileIn = item.getInputStream();////如果直接写成这样new FileInputStream(filePath);就会出现在服务器本机找file上传的问题
//可以查看item.getInputStream()最后其实是从memoryOutputStream(内存里记忆的客户端文件流)来取流的句柄的。

以下是正确的实现

 

[code]

 

/**上传附件的时候调用
  * @param request
  * @param response
  * @throws Exception
  */
 public void doUpload(HttpServletRequest request, HttpServletResponse response) throws Exception {
  CustomProperty cp = CustomProperty.getInstance();
  try {
            //调用apache控件上传文件,返回数组,第一个存放文件对象,第二个存放参数对象
   Object obj[] = ApacheUploadTool.getUploadFileInfo(request);
   List fileList = (List)obj[0];
   Map paras = (Map)obj[1];
   if(fileList == null || fileList.size()==0){
    cp.set("MESSAGE","找不到上传的文件");
                return;
            }
   
   String aVirtualFileName="";
   String newId="";
   String newFileName="";
   String aFileType ="";
   String docSize = "";
   String editMode = HttpUtil.getParameter(request, "edit_mode");
   String objectId = HttpUtil.getParameter(request, "OBJECT_ID");
   String busiType = HttpUtil.getParameter(request, "BUSI_TYPE");
//   陈超调试修改添加的输出
//   System.out.println("================"+editMode);
   //保存附件信息
   for(int i=0;i<fileList.size();i++){
    FileItem item = (FileItem)fileList.get(i);
    //获取文件流、文件名称
    String fileName = fixFileName(item.getName());
    IDocumentInfoSV idao = CommonService.getIDocumentInfoSV();
    docSize = String.valueOf(item.getSize());
    String codetype = String.valueOf(StaticValue.CFG_FTP_PATH_CODE);
    String ftpPathName = BaseDataCodeAction.getCodeName(codetype, busiType);
    if(null==ftpPathName||"".equals(ftpPathName)){
     throw new Exception("没有该业务对应的FTP路径配置!");
    }
//    陈超调试的注释
//    System.out.println("ftpPathName="+ftpPathName);
    FtpUtil ftpUtil = new FtpUtil(ftpPathName);
//    FtpUtilPro ftpUtil = new FtpUtilPro(ftpPathName);
//    陈超添加的调试输出
//    System.out.println("item=="+item);
//    System.out.println("item.getInputStream()=="+item.getInputStream());
    InputStream fileIn = item.getInputStream();//new FileInputStream(filePath);//如果直接写成这样就会出现在服务器本机找file上传的问题
//可以查看item.getInputStream()最后其实是从memoryOutputStream(内存里记忆的客户端文件流)来取流的句柄的。
    //获取新的文件名,判断是否存在
    IBODocumentInfoValue[] retValues =  CommonService.getIDocumentInfoSV().queryDocumentInfoList(Long.parseLong(busiType), Long.parseLong(objectId));
    for(int j=0;j<retValues.length;j++){
     String docName = retValues[j].getDocumentName();
     if(fileName.equals(docName)){
      ExceptionUtil.throwBossException(83000015,new String[]{fileName});
     }
    }
    newFileName = fileName;
    if(editMode.equals("addNew")){
//     陈超添加的调试输出
//     ftpUtil.upload(fileName, fileIn,FtpUtil.BIN);
     ftpUtil.upload(fileName, fileIn,FtpUtil.BIN);
    }
    else if (editMode.equals("modify")) {
//     System.out.println("================"+HttpUtil.getParameter(request, "DOCUMENT_ID"));
     String oldId = HttpUtil.getParameter(request, "DOCUMENT_ID");
                    IBODocumentInfoValue acond = new BODocumentInfoBean();
                    acond.setDocumentId(Long.parseLong(oldId));
//                  陈超更改查询STATE为1
                    acond.setState(1);
                    IBODocumentInfoValue[] beanValues = idao.getDocumentInfo(acond,"",null);
                    if(null == beanValues || beanValues.length==0){
                        throw new Exception("没有文档信息");
                    }
                    IBODocumentInfoValue beanValue = beanValues[0];
                    String oldFileName = beanValue.getDocumentName();
     ftpUtil.upload(oldFileName, fileIn,FtpUtil.BIN);
    }
    if(i==0){
     aVirtualFileName = newFileName;
    }else{
     aVirtualFileName = aVirtualFileName  + "," +  newFileName;
    }
   }
            cp.set("IsOk","TRUE");
   cp.set("MESSAGE", "附件"+aVirtualFileName+"上传成功!");
   cp.set("VIRTUAL_FILE_NAME_LIST", aVirtualFileName);
   cp.set("DOCUMENT_ID", newId);
   cp.set("DOCUMENT_SIZE", docSize);
  } catch (Exception ex) {
   cp.set("IsOk","FALSE");
   cp.set("MESSAGE",StaticValue.SYS_ERROR_INFO);
   log.error(ex);
   if(!ex.equals("")){
                cp.set("MESSAGE",ExceptionUtil.getBossExceptionHint(ex));
   }
  }finally{
   ApacheUploadTool.showFileUploadMsg(response,cp);
        }
 }
[/code]

 

附件是自己的ftp实现示例,和一些网上最简单的jsp上传的代码,也最能说明原理

 

分享到:
评论

相关推荐

    JAVA 上传音乐

    字节流包括InputStream(输入)和OutputStream(输出)类,以及它们的子类如FileInputStream和FileOutputStream。字符流则有Reader和Writer系列。 在上传音乐这样的大文件场景下,通常会使用BufferedInputStream和...

    java实现 上传和下载

    这里,我们将深入探讨如何实现这两个核心操作,以及相关的技术、工具和最佳实践。 首先,文件上传通常涉及到用户通过Web表单将本地文件发送到服务器的过程。在Java中,这主要依赖于Servlet API,特别是`...

    Java实现FTP文件上传和下载

    在Java编程语言中,FTP(File Transfer Protocol)文件上传和下载是常见的网络操作,用于在本地计算机和远程服务器之间交换文件。以下将详细介绍如何使用Java实现FTP文件上传和下载的步骤,以及涉及到的关键知识点。...

    java上传并读取excel工具类

    本篇文章将深入探讨如何使用Java实现Excel文件的上传和读取,重点关注`MultiFile`转换为`File`以及处理多Sheet页的技巧。 首先,我们需要了解Java中处理Excel的库。Apache POI是一个广泛使用的开源库,它提供了API...

    JAVA通过HttpURLConnection 上传和下载文件的方法

    JAVA通过HttpURLConnection上传和下载文件的方法 JAVA通过HttpURLConnection上传和下载文件的方法是非常有实用价值的,需要的朋友可以参考下。HttpURLConnection是一个Java类,用于从网络中读取数据或向网络中写入...

    Java版Linux文件上传下载、windows本地文件上传下载

    在Java编程环境中,实现Linux与Windows之间的文件上传和下载是一项常见的任务,特别是在分布式系统和跨平台应用中。本文将深入探讨如何使用Java技术实现在Linux和Windows之间进行文件的互传,以及创建一个HTML界面来...

    DiskFileItemFactory实现文件上传 FileInputStream

    本文将详细介绍`DiskFileItemFactory`和`FileInputStream`在文件上传过程中的应用。 `DiskFileItemFactory`是FileUpload组件的核心工厂类,它负责创建`DiskFileItem`对象。`DiskFileItem`是一个实现了`FileItem`...

    java 监听本地文件自动上传服务器

    在IT行业中,Java作为一种强大的编程语言,被广泛用于各种任务,包括文件系统监控和网络通信。本篇文章将详细探讨如何使用Java实现本地文件监听,并自动将其上传至服务器,以实现文件同步功能。 首先,让我们从...

    Java上传下载ftp上的文件

    本文将深入探讨如何使用Java实现FTP文件的上传和下载功能,以满足标题和描述中的需求。作者宋海康提供的案例将为我们提供一个基础,帮助我们理解这个过程。 首先,我们需要导入Java FTP库,通常是`commons-net`库,...

    java ftp上传 下载 文件压缩解压

    这篇博客“java ftp上传 下载 文件压缩解压”很可能是关于如何使用Java实现FTP文件上传、下载以及文件的压缩与解压功能。下面我们将深入探讨这些知识点。 首先,FTP上传和下载是Java中常见的任务,通常通过`java...

    Java对IO类File的操作

    在Java编程语言中,`java.io.File`类是处理文件和目录的核心类。它提供了创建、删除、重命名文件和目录以及获取文件属性等操作。本文将深入探讨`File`类的基本使用方法,并通过分析提供的压缩包中的示例代码来展示...

    使用java上传MP4文件至mongodb数据库,并下载 源代码

    在IT行业中,数据库存储是关键任务之一...总之,通过Java和MongoDB的GridFS,我们可以便捷地处理MP4等大文件的上传和下载。这使得MongoDB成为存储多媒体数据的理想选择,特别是在需要快速读取和检索这些数据的应用中。

    java文件上传下载

    在Java Web开发中,文件上传和下载是常见的功能需求,特别是在Spring MVC框架下。本教程将详细介绍如何利用`commons-fileupload`组件与Spring MVC结合实现文件上传,以及如何通过Servlet和`response`输出流实现文件...

    Java使用FileInputStream流读取文件示例详解

    Java使用FileInputStream流读取文件示例详解 本文将详细介绍Java使用...通过上述示例代码,我们可以了解到Java使用FileInputStream流读取文件的详细过程,并掌握了FileInputStream的构造方法和常用API。

    java文件上传源码

    文件读写操作是文件上传的另一部分,Java提供了一系列的类如`java.io.File`、`java.io.FileInputStream`、`java.io.FileOutputStream`等来处理文件的创建、读取和写入。一旦Servlet获取到上传的文件流,它会创建一个...

    java实现pdf上传、下载、在线预览、删除、修改等功能

    在Java编程环境中,处理PDF(Portable Document Format)文件是一项常见的任务,这通常涉及到文件的上传、下载、在线预览、删除以及修改等操作。以下是对这些功能的详细说明: 1. **PDF上传**: PDF文件的上传主要...

    java ftp断点上传和下载

    FileInputStream inputStream = new FileInputStream(localFile); boolean success = ftpClient.storeFile(filename, inputStream); ``` 8. **处理结果和清理**:无论上传还是下载,完成后都要记得关闭流和断开...

    Java Spring Boot应用程序中实现文件上传和下载功能

    本文将详细介绍如何在Spring Boot项目中配置文件上传和下载的相关依赖,以及如何创建处理文件上传和下载请求的Controller。 #### 一、配置文件上传和下载的相关依赖 为了实现文件的上传和下载功能,首先需要在项目...

Global site tag (gtag.js) - Google Analytics