谁有关于java nio多文件的上传的简单例子共享下哈。。50分相送或者写出你的感言也可以

解决方案 »

  1.   

    在客户端 往服务器发送数据的时候 
    发送一部分之后Thread.sleep(1);是否合适
    如下:                Thread.sleep(1);//暂停1毫秒
    while (buffer1.hasRemaining())//发送数据代码段
    {
    schannel.write(buffer1);
    }
    Thread.sleep(1);//如此设置是否合适。为什么 while (buffer2.hasRemaining())
    {
    schannel.write(buffer2);
    }
    Thread.sleep(1);
      

  2.   


    package photo;import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Iterator;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    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.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;public class Upload extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType("text/html; charset=GB2312");
    PrintWriter out = response.getWriter();
    try {
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload sevletFileUpload = new ServletFileUpload(factory);
    // 设置允许用户上传文件大小,单位:字节,这里设为2m
    sevletFileUpload.setSizeMax(2 * 1024 * 1024);
    // 设置最多只允许在内存中存储的数据,单位:字节
    factory.setSizeThreshold(4096);
    // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
    factory.setRepository(new File("d:\\temp"));
    // 开始读取上传信息 
    List fileItems = sevletFileUpload.parseRequest(request);
    // 依次处理每个上传的文件
    Iterator iter = fileItems.iterator();
    // 正则匹配,过滤路径取文件名
    String regExp = ".+\\\\(.+)$";
    // 过滤掉的文件类型
    String[] errorType = { ".exe", ".com", ".cgi", ".asp" };
    Pattern p = Pattern.compile(regExp);
    while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next();
    // 忽略其他不是文件域的所有表单信息
    if (!item.isFormField()) {
    String name = item.getName();
    long size = item.getSize();
    if ((name == null || name.equals("")) && size == 0)
    continue;
    Matcher m = p.matcher(name);
    boolean result = m.find();
    if (result) {
    for (int temp = 0; temp < errorType.length; temp++) {
    if (m.group(1).endsWith(errorType[temp])) {
    throw new IOException(name + ": 非法文件类型禁止上传");
    }
    }
    try {
    // 保存上传的文件到指定的目录
    // 在下文中上传文件至数据库时,将对这里改写开始
    item.write(new File("d:\\uploadfile\\"+ m.group(1)));
    out.print(name + "&nbsp;&nbsp;" + size + "<br>");
    // 在下文中上传文件至数据库时,将对这里改写结束
    } catch (Exception e) {
    out.println(e);
    }

    else {
    throw new IOException("fail to upload");
    }
    }
    }
    } catch (IOException e) {
    out.println(e); } catch (FileUploadException e) {
    out.println(e);
    }
    } public void init() throws ServletException {
    // Put your code here
    }}
      

  3.   

    对于第二个问题,可以是可以,我感觉没有必要这样
    Thread.sleep(1);
    线程暂停1毫秒,
    其实线程是经常被暂停和打断的,Thread.Sleep操作只是人为的让出时间给其他线程来运行。线程管理单元的操作是以几个到几使个毫秒为调度周期的
    也就是说你用了Thread.Sleep 无论你指定多少
    当前线程都要进行最少几个毫秒的等待
    如果此刻正好有几个高优先级线程在等待  它们会优先执行而放在客户端 往服务器发送数据的时候 这种情况下,每发送一部分数据就会使线程暂停一下,
    这样系统性能不但没有像你想象的那样,线程暂停下,给其他线程来执行使性能提高,
    反而这样频繁的切换会使之效率下降
      

  4.   

    呵呵。。谢谢,[email protected]关于这个影响效率的事情 还是不特明白。。能麻烦你+下我qq给细讲下么?  前辈 拜托你了
      

  5.   

     //我的初始想法是这样的
    //在传输数据的时候 默认是连在一起的。在接收数据的时候 有些麻烦//为了避免这种数据字节拆分的麻烦,我是这样操作的       Thread.sleep(1);//暂停1毫秒
            while (buffer1.hasRemaining())//1.发送一段byte ,用来说明后面2的文件信息   (发送文件之前先发送文件标题 大小等信息)     
                 {
                schannel.write(buffer1);
            }
            Thread.sleep(1);//暂停,以便服务器 获取并得到马上要传的文件信息        while (buffer2.hasRemaining())//2.发送文件。先前已经将本文件的初始信息发送过去了。
            {
                schannel.write(buffer2);
            }
            Thread.sleep(1);//暂停。
                            ......
      

  6.   

    我说大哥。你不会给我发错了吧 怎么还是jsp的上传啊
    我要的是java 的nio上传呢。大哥不会是发错了吧