读书人

有关java下传和File以及FileInputStre

发布时间: 2012-12-26 14:39:29 作者: rapoo

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

最近在帮助同事解决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上传的代码,也最能说明原理

?

读书人网 >编程

热点推荐