`

有关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程序中FTP的连接以及上传文件

    java.io.File file_in = new java.io.File("e://12//" + fileList[i]); FileInputStream is = new FileInputStream(file_in); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1)...

    java FTP上传

    FTP上传到服务器 非常好用 import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import java.util.StringTokenizer; import sun.net.ftp.FtpClient; /**

    图片文件上次,获取图片文件实际类型

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import ...

    Struts2上传文件出错

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java....

    ganymed-ssh2-build210.jar java远程访问linux服务器操作、上传下载文件

    FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream byteArray = new ByteArrayOutputStream(1024*1024); byte[] b = new byte[1024*1024]; int i; while ((i = fis.read(b)) != -1) { ...

    bytea类型上传下载图片.txt

    FileInputStream inputStream = new FileInputStream(file_i); dbStat.setBinaryStream(2, inputStream, (int) file_i.length()); // 执行SQL dbStat.execute(); k++; } ...

    ssh 文件上传

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.struts2.ServletActionContext; import com.iss.dao.TbUserinfo; import com.iss.server.Manager; ...

    FTP源代码例子

    java.io.File file_in = new java.io.File(filename); if (file_in.length()==0) { return "上传文件为空!"; } is = new FileInputStream(file_in); byte[] bytes = new byte[1024]; int c; while ((c = is....

    android 上传文件到服务器代码实例

    android对于上传文件,还是很简单的,和java里面的上传都是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要一些content-type这些参数的配置! 如果这些都弄好了,上传就很简单了! 下面是...

    Android实现上传文件到服务器实例详解

    本实例实现每隔5秒上传一次,通过服务器端获取手机上传过来的文件信息并做相应处理;...import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; /** * 上传文

    ftp实现简单的文件传输

    DataInputStream dis=new DataInputStream(new BufferedInputStream(new FileInputStream(filepath))); DataOutputStream dos=new DataOutputStream(s.getOutputStream()); dos.writeUTF(file.getName()...

    strust文件上传

    fis = new FileInputStream(uploadFile); bis = new BufferedInputStream(fis); fos = response.getOutputStream(); bos = new BufferedOutputStream(fos); //这个就就是弹出下载对话框的关键代码 response....

    IO各种操作文件,字符流、字节流等

    javaIO操作各种文件,筛选文件,拷贝文件,上传下载,字符流和字节流都有,根据实际项目情况直接贴就可以了,根据文件类型选择不同的testclss就可以。全部使用效率最高的流

    Android上传文件到服务器的方法

    本文实例为大家分享了Android...import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; /** * 上传文件 */ public class FormFile { /* 上传文

    JSP开发之Struts2实现下载功能的实例

    import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import com.opensymphony.xwork2.ActionSupport; public class DownloadAction extends ActionSupport { private static ...

    jquery ajaxfileupload异步上传插件

    本文实例为大家分享了ajaxfileupload异步上传插件的使用方法,供大家参考,具体内容如下 服务器端采用struts2来处理文件上传。...import java.io.FileInputStream; import java.io.FileOutputStream; import org.ap

    Android通过SOCKET下载文件的方法

    本文实例讲述了Android通过SOCKET下载文件的方法。...import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import

    jsp最详细教程 最容易入门

    JSP 中的文件操作...............................................................166 4.1 File 类.........................................166 4.1.1 获取文件的属性............................................

Global site tag (gtag.js) - Google Analytics