「java上传方法」JAVA实现文件上传

博主:adminadmin 2022-12-25 11:12:10 71

本篇文章给大家谈谈java上传方法,以及JAVA实现文件上传对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java怎么用commons-fileupload实现上传文件

文件上传步骤:

     1. 导入jar包

          common-fileupload.jar

          common-io.jar      

     2. 上传jsp页面编辑

         body

            form action="${pageContext.request.contextPath}/servlet/UploadHandleServlet" enctype="multipart/form-data" method="post"

                上传用户:input type="text" name="username"br/

                上传文件1:input type="file" name="file1"br/

                上传文件2:input type="file" name="file2"br/

                            input type="submit" value="提交"

            /form

        /body    

     3. 消息提示页面(成功or失败)     

            body

                ${message}

            /body    

     4. 处理文件上传的servlet编写   

         import java.io.File;

         import java.io.FileOutputStream;

         import java.io.IOException;

         import java.io.InputStream;

         import java.util.List;

         import java.util.UUID;

             

             import javax.servlet.ServletException;

             import javax.servlet.http.HttpServlet;

             import javax.servlet.http.HttpServletRequest;

             import javax.servlet.http.HttpServletResponse;

             import org.apache.commons.fileupload.FileItem;

             import org.apache.commons.fileupload.FileUploadBase;

             import org.apache.commons.fileupload.ProgressListener;

             import org.apache.commons.fileupload.disk.DiskFileItemFactory;

             import org.apache.commons.fileupload.servlet.ServletFileUpload;

              

             public class UploadHandleServlet extends HttpServlet {

              

              public void doGet(HttpServletRequest request, HttpServletResponse response)

                throws ServletException, IOException {

                 //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全

                 String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");

                 //上传时生成的临时文件保存目录

                 String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");

                 File tmpFile = new File(tempPath);

                 if (!tmpFile.exists()) {

                  //创建临时目录

                  tmpFile.mkdir();

                 }

                  

                 //消息提示

                 String message = "";

                 try{

                  //使用Apache文件上传组件处理文件上传步骤:

                  //1、创建一个DiskFileItemFactory工厂

                  DiskFileItemFactory factory = new DiskFileItemFactory();

                  //设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。

                  factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB

                  //设置上传时生成的临时文件的保存目录

                  factory.setRepository(tmpFile);

                  //2、创建一个文件上传解析器

                  ServletFileUpload upload = new ServletFileUpload(factory);

                  //监听文件上传进度

                  upload.setProgressListener(new ProgressListener(){

                   public void update(long pBytesRead, long pContentLength, int arg2) {

                    System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);

                    /**

                    * 文件大小为:14608,当前已处理:4096

                     文件大小为:14608,当前已处理:7367

                     文件大小为:14608,当前已处理:11419

                     文件大小为:14608,当前已处理:14608

                    */

                   }

                  });

                  //解决上传文件名的中文乱码

                  upload.setHeaderEncoding("UTF-8"); 

                  //3、判断提交上来的数据是否是上传表单的数据

                  if(!ServletFileUpload.isMultipartContent(request)){

                   //按照传统方式获取数据

                   return;

                  }

                   

                  //设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB

                  upload.setFileSizeMax(1024*1024);

                  //设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB

                  upload.setSizeMax(1024*1024*10);

                  //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个ListFileItem集合,每一个FileItem对应一个Form表单的输入项

                  ListFileItem list = upload.parseRequest(request);

                  for(FileItem item : list){

                   //如果fileitem中封装的是普通输入项的数据

                   if(item.isFormField()){

                    String name = item.getFieldName();

                    //解决普通输入项的数据的中文乱码问题

                    String value = item.getString("UTF-8");

                    //value = new String(value.getBytes("iso8859-1"),"UTF-8");

                    System.out.println(name + "=" + value);

                   }else{//如果fileitem中封装的是上传文件

                    //得到上传的文件名称,

                    String filename = item.getName();

                    System.out.println(filename);

                    if(filename==null || filename.trim().equals("")){

                     continue;

                    }

                    //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt

                    //处理获取到的上传文件的文件名的路径部分,只保留文件名部分

                    filename = filename.substring(filename.lastIndexOf("\\")+1);

                    //得到上传文件的扩展名

                    String fileExtName = filename.substring(filename.lastIndexOf(".")+1);

                    //如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法

                    System.out.println("上传的文件的扩展名是:"+fileExtName);

                    //获取item中的上传文件的输入流

                    InputStream in = item.getInputStream();

                    //得到文件保存的名称

                    String saveFilename = makeFileName(filename);

                    //得到文件的保存目录

                    String realSavePath = makePath(saveFilename, savePath);

                    //创建一个文件输出流

                    FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);

                   //创建一个缓冲区

                    byte buffer[] = new byte[1024];

                    //判断输入流中的数据是否已经读完的标识        int len = 0;

                    //循环将输入流读入到缓冲区当中,(len=in.read(buffer))0就表示in里面还有数据

                    while((len=in.read(buffer))0){

                     //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中

                     out.write(buffer, 0, len);

                    }

                    //关闭输入流

                    in.close();

                    //关闭输出流

                    out.close();        //删除处理文件上传时生成的临时文件        //item.delete();        message = "文件上传成功!";

                   }

                  }

                 }catch (FileUploadBase.FileSizeLimitExceededException e) {

                  e.printStackTrace();

                  request.setAttribute("message", "单个文件超出最大值!!!");

                  request.getRequestDispatcher("/message.jsp").forward(request, response);

                  return;

                 }catch (FileUploadBase.SizeLimitExceededException e) {

                  e.printStackTrace();

                  request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");

                  request.getRequestDispatcher("/message.jsp").forward(request, response);

                  return;

                 }catch (Exception e) {

                  message= "文件上传失败!";

                  e.printStackTrace();

                 }

                 request.setAttribute("message",message);

                 request.getRequestDispatcher("/message.jsp").forward(request, response);

              }

              private String makeFileName(String filename){ //2.jpg

               //为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名

               return UUID.randomUUID().toString() + "_" + filename;

              }  

             private String makePath(String filename,String savePath){

               //得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址

               int hashcode = filename.hashCode();

               int dir1 = hashcode0xf; //0--15

               int dir2 = (hashcode0xf0)4; //0-15

               //构造新的保存目录

               String dir = savePath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5

               if(!file.exists()){

                file.mkdirs();

              }

               return dir;

              }

              

              public void doPost(HttpServletRequest request, HttpServletResponse response)

                throws ServletException, IOException {

               doGet(request, response);

              }

             }

     5.编写web.xml文件(servlet的映射配置)   

            servlet

                servlet-nameUploadHandleServlet/servlet-name

                servlet-classme.gacl.web.controller.UploadHandleServlet/servlet-class

            /servlet

             

            servlet-mapping

                servlet-nameUploadHandleServlet/servlet-name

                url-pattern/servlet/UploadHandleServlet/url-pattern

            /servlet-mapping

 

 

 注: 网上看到的,出处找不到了,望见谅!!

java上传成功后怎么触发其他操作

java get方式异步上传_简述Java异步上传文件的三种方式 原创

2021-02-13 16:31:03

yi bbbian

码龄4年

关注

本文为大家分享了三种Java异步上传文件方式,供大家参考,具体内容如下

用第三方控件,如Flash,ActiveX等浏览器插件上传。

使用隐藏的iframe模拟异步上传。

使用XMLHttpRequest2来实现异步上传。

第一种使用浏览器插件上传,需要一定的底层编码功底,在这里我就不讲了,以免误人子弟,提出这点大家可以自行百度。

第二种使用隐藏的iframe模拟异步上传。为什么在这里说的是模拟呢?因为我们其实是将返回结果放在了一个隐藏的iframe中,所以才没有使当前页面跳转,感觉就像是异步操作一样。

隐藏的iframe上传文件

附件:

正在上传...

// 上传完成后的回调

function uploadFinished(fileName) {

addToFlist(fileName);

loading(false);

}

function addToFlist(fname) {

var temp = ["

",

fname,

"删除",

"

"

];

$("#flist").append(temp.join(""));

}

function loading(showloading) {

if (showloading) {

$("#uptxt").show();

} else {

$("#uptxt").hide;

}

}

这种技术有两个关键的地方:

1.form会指定target,提交的结果定向返回到隐藏的ifram中。(即form的target与iframe的name属性一致)。

2.提交完成后,iframe中页面与主页面通信,通知上传结果及服务端文件信息

如何与主页面通信呢?

我们用nodejs在接收完了文件后返回了一个window.parent.主页面定义的方法,执行后可以得知文件上传完成。代码很简单:

router.post('/upload2', multipartMiddleware, function(req, res) {

var fpath = req.files.myfile.path;

var fname = fpath.substr(fpath.lastIndexOf('\\') + 1);

setTimeout(function {

var ret = ["

"window.parent.uploadFinished('" + fname + "');",

""];

res.send(ret.join(""));

}, 3000);

});

执行后可以打开开发人员选项,你会发现隐藏iframe中返回了服务器的一些数据。

第三种使用XMLHttpRequest2来进行真正的异步上传。

还是先贴出代码:

执行后可以打开开发人员选项,你会发现隐藏iframe中返回了服务器的一些数据。第三种使用XMLHttpRequest2来进行真正的异步上传。还是先贴出代码:

xhr level2 异步上传

附件:

正在上传...

停止上传

function upload {

// 1.准备FormData

var fd = new FormData;

fd.append("myfile", $("#myfile")[0].files[0]);

// 创建xhr对象

var xhr = new XMLHttpRequest;

// 监听状态,实时响应

// xhr 和 xhr.upload 都有progress事件,xhr.progress是下载进度,xhr.upload.progress是上传进度

xhr.upload.onprogress = function(event) {

if (event.lengthComputable) {

var percent = Math.round(event.loaded * 100 / event.total);

console.log('%d%', percent);

$("#upprog").text(percent);

}

};

// 传输开始事件

xhr.onloadstart = function(event) {

console.log('load start');

$("#upprog").text('开始上传');

$("#stopbtn").one('click', function { xhr.abort; $(this).hide();});

loading(true);

};

// ajax过程成功完成事件

xhr.onload = function(event) {

console.log('load success');

$("#upprog").text('上传成功');

console.log(xhr.responseText);

var ret = JSON.parse(xhr.responseText);

addToFlist(ret.fname);

};

// ajax过程发生错误事件

xhr.onerror = function(event) {

console.log('error');

$("#upprog").text('发生错误');

};

// ajax被取消

xhr.onabort = function(event) {

console.log('abort');

$("#upprog").text('操作被取消');

};

// loadend传输结束,不管成功失败都会被触发

xhr.onloadend = function (event) {

console.log('load end');

loading(false);

};

// 发起ajax请求传送数据

xhr.open('POST', '/upload3', true);

xhr.send(fd);

}

function addToFlist(fname) {

var temp = ["

",

fname,

"删除",

"

"

];

$("#flist").append(temp.join(""));

}

function delFile(fname) {

console.log('to delete file: ' + fname);

// TODO: 请实现

}

function loading(showloading) {

if (showloading) {

$("#uptxt").show();

$("#stopbtn").show();

} else {

$("#uptxt").hide();

$("#stopbtn").hide();

}

}

代码有点多,但是通俗易懂。使用过AJAX的人都知道,XHR对象提供了一个onreadystatechange的回调方法来监听整个请求/响应过程。在XMLHttpRequest2级规范中又多了几个进度事件。有以下6个事件:

1.loadstart:在接收到响应数据的第一个字节时触发。

2.progress:在接收响应期间持续不断地触发。

3.error:在请求发生错误时触发。

4.abort:在因为调用abort方法而终止连接时触发。

5.load:在接收到完整的响应数据时触发。

6.loadend: 在通信完成或者触发error,abort,load事件后触发。

这次我们可以解读代码:当传输事件开始后,我们便在停止传送按钮上添加点击事件,内置了abort方法可以停止传送。若不点则会正常上传直到传送完毕为止。其后台代码类似第二种方法。

三种方法各有优劣,做个简单的小结吧。

第三方控件交互性和可控性好,因为接近底层,其性能也是很优秀的。但是由于编写难度大通常需要自己安装插件,有时可能需要自己进行编写。

隐藏的iframe方法我个人觉得是非常有思想的一个方法,iframe可以帮我们做很多事。这种方式具有广泛的浏览器兼容性而且不需要安装插件。但是它交互性差,上传过程不可控,而且性能也是很一般的。

XHR2级的纯ajax上传,它必须要版本比较高一点的浏览器(ie9+)。但是它交互性特别好,可以看到上传进度并且是可控的。

java多文件上传

即使再多文件也是通过的单个文件逐次上传的(zip等压缩包实际上是一个文件)。实现思路就是将多个文件循环进行上传,上传方法举例:

/**

* 上传文件

*

* @param fileName

* @param plainFilePath 文件路径路径

* @param filepath

* @return

* @throws Exception

*/

public static String fileUploadByFtp(String plainFilePath, String fileName, String filepath) throws Exception {

FileInputStream fis = null;

ByteArrayOutputStream bos = null;

FTPClient ftpClient = new FTPClient();

String bl = "false";

try {

fis = new FileInputStream(plainFilePath);

bos = new ByteArrayOutputStream(fis.available());

byte[] buffer = new byte[1024];

int count = 0;

while ((count = fis.read(buffer)) != -1) {

bos.write(buffer, 0, count);

}

bos.flush();

Log.info("加密上传文件开始");

Log.info("连接远程上传服务器"+CCFCCBUtil.CCFCCBHOSTNAME+":"+22);

ftpClient.connect(CCFCCBUtil.CCFCCBHOSTNAME, 22);

ftpClient.login(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBLOGINPASSWORD);

FTPFile[] fs;

fs = ftpClient.listFiles();

for (FTPFile ff : fs) {

if (ff.getName().equals(filepath)) {

bl="true";

ftpClient.changeWorkingDirectory("/"+filepath+"");

}

}

Log.info("检查文件路径是否存在:/"+filepath);

if("false".equals(bl)){

ViewUtil.dataSEErrorPerformedCommon( "查询文件路径不存在:"+"/"+filepath);

return bl;

}

ftpClient.setBufferSize(1024);

ftpClient.setControlEncoding("GBK");

// 设置文件类型(二进制)

ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

ftpClient.storeFile(fileName, fis);

Log.info("上传文件成功:"+fileName+"。文件保存路径:"+"/"+filepath+"/");

return bl;

} catch (Exception e) {

throw e;

} finally {

if (fis != null) {

try {

fis.close();

} catch (Exception e) {

Log.info(e.getLocalizedMessage(), e);

}

}

if (bos != null) {

try {

bos.close();

} catch (Exception e) {

Log.info(e.getLocalizedMessage(), e);

}

}

}

}

备注:只需要修改上传的服务器地址、用户名、密码即可进行服务器访问上传。根据实际需要修改即可。

java中怎样上传文件

Java代码实现文件上传

FormFile file=manform.getFile(); 

  String newfileName = null;

  String newpathname=null;

  String fileAddre="/numUp";

  try {

   InputStream stream = file.getInputStream();// 把文件读入

    String filePath = request.getRealPath(fileAddre);//取系统当前路径

          File file1 = new File(filePath);//添加了自动创建目录的功能

       ((File) file1).mkdir();   

    newfileName = System.currentTimeMillis()

     + file.getFileName().substring(

       file.getFileName().lastIndexOf('.'));

   ByteArrayOutputStream baos = new ByteArrayOutputStream();

   OutputStream bos = new FileOutputStream(filePath + "/"

     + newfileName);

   newpathname=filePath+"/"+newfileName;

   System.out.println(newpathname);

   // 建立一个上传文件的输出流

    System.out.println(filePath+"/"+file.getFileName());

   int bytesRead = 0;

   byte[] buffer = new byte[8192];

   while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {

    bos.write(buffer, 0, bytesRead);// 将文件写入服务器

   }

   bos.close();

   stream.close();

    } catch (FileNotFoundException e) {

   e.printStackTrace();

  } catch (IOException e) {

   e.printStackTrace();

  }

java中几种上传方法介绍,比较

上传方法只有一种就是io操作。但是框架有好多。常见的有Javaweb中常用的apache的common-fileupload组件、javaee自带的servlet3.1中的原生上传组件,servlet的比较麻烦。

java上传方法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于JAVA实现文件上传、java上传方法的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-25,除非注明,否则均为首码项目网原创文章,转载请注明出处。