大文件上传 解决方案

场景:java 大文件上传?解决方案

java 大文件上传????????????
我想在java中实现大文件的上传(大概500M),

自己写的上传小一点文件还行,大一点的就崩溃了!!!

有没有这方面的例子????

不胜感激!!!!!!!!!!!

------解决方案--------------------
设置好缓冲500M应该是能承受的喵~~``

不知道楼主怎么实现的...
------解决方案--------------------
500M不是个小数目,能上传也很慢把
------解决方案--------------------
这么大的文件,晕哦,客户端提交数据,肯定全部都会缓存到你的服务器上来,你服务器内存不够肯定死了撒,呵呵,这么大的文件用其他方式吧,边读边写。用web上传它是一并传上来的,你搞不定的。
------解决方案--------------------
用apache上传组件吧
------解决方案--------------------
我这有个例子,没写注释
Java code
package com.fuyou;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class Fileupload extends HttpServlet {

    /**
     * Constructor of the object.
     */
    public Fileupload() {
        super();
    }

    /**
     * Destruction of the servlet. <br>
     */
    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }

    /**
     * The doGet method of the servlet. <br>
     * 
     * This method is called when a form has its tag value method equals to get.
     * 
     * @param request
     *            the request send by the client to the server
     * @param response
     *            the response send by the server to the client
     * @throws ServletException
     *             if an error occurred
     * @throws IOException
     *             if an error occurred
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out
                .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.print("    This is ");
        out.print(this.getClass());
        out.println(", using the GET method");
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

    /**
     * The doPost method of the servlet. <br>
     * 
     * This method is called when a form has its tag value method equals to
     * post.
     * 
     * @param request
     *            the request send by the client to the server
     * @param response
     *            the response send by the server to the client
     * @throws ServletException
     *             if an error occurred
     * @throws IOException
     *             if an error occurred
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    System.out.println("requestCo"+"=="+request.getContentType());
        response.setContentType("text/html;charset=gb2312");
        PrintWriter out = response.getWriter();
        // 设置保存的文件的目录
        String uploadDir = getServletContext().getRealPath("/upload");
        System.out.println(uploadDir);
        if (uploadDir == null) {
            out.println("无法访问存储目录!");
            return;
        }

        File fUploadDir = new File(uploadDir);
        if (!fUploadDir.exists()) {
            if(!fUploadDir.mkdir()){
            out.println("无法创建存储目录!");
            return;
            }
        }
        if (!ServletFileUpload.isMultipartContent(request)) {
            out.println("只能外理mul的类型的数据");
            return;
        }
     FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload  fu = new ServletFileUpload(factory);//关键类
        fu.setSizeMax(1024 * 1024 * 400);
        // FileItemFactory factory = new DiskFileItemFactory();
        DiskFileItemFactory s = new DiskFileItemFactory();//设置临时文件最大值,如果大于这个值,就建一临时文件
        s.setSizeThreshold(1024*1024);
        fu.setHeaderEncoding("gb2312");
        List fileItem = null;
        try {
            fileItem = fu.parseRequest(request);
        } catch (FileUploadException e) {
            out.println("解析出错了");
            e.printStackTrace(out);
            return;
        }
        
    
        Iterator i = fileItem.iterator();
        while (i.hasNext()) {
            FileItem fi = (FileItem) i.next();
            if (fi.isFormField()) {
                String content = fi.getString("gb2312");
                String fieldName = fi.getFieldName();
                System.out.println(fieldName+content);
            } else {
                String pathSrc = fi.getName();
                if (pathSrc.trim().equals("")) {
                    continue;
                }
                int start = pathSrc.lastIndexOf("\\");
                String fileName = pathSrc.substring(start + 1);
                File pathDest = new File(uploadDir, fileName);
                try {
                    fi.write(pathDest);
                    String fieldName = fi.getFieldName();
                    request.setAttribute(fileName, fileName);
                } catch (Exception e) {
                    out.println("存储文件出现问题");
                    e.printStackTrace(out);
                    return;
                }finally{
                    fi.delete();
                }

            }
        }

    }

    /**
     * Initialization of the servlet. <br>
     * 
     * @throws ServletException
     *             if an error occurs
     */
    public void init() throws ServletException {
        // Put your code here
    }

}

------解决方案--------------------
如果你不使用插件,那么速度会慢的惊人。当然,上传是可以的。

你所谓的崩溃是你在内存处理了所有的上传数据,你应该把他们保存到临时文件里,而不是全部在内存处理
------解决方案--------------------
你上传崩溃是你的服务器不行
------解决方案--------------------
建议用applet或ftp
------解决方案--------------------
500M?
用fileupload的吧
------解决方案--------------------
smartUpload或者fileupload插件都可以的

smartUpload就是为了实现文件上传功能的