Java 如何使用commons file upload streaming api上载文件

Java 如何使用commons file upload streaming api上载文件,java,jsp,Java,Jsp,我遵循commons文件上传站点提供的关于流式API的示例。我一直在试图弄清楚如何获取上传文件的文件扩展名,如何将文件写入目录,最糟糕的是编写示例注释的人在哪里处理输入流…,这让我怀疑这是否是一件如此琐碎的事情,以至于我是唯一一个不知道如何处理的人 在HTML文件中使用此选项: 在UploadControllerservlet中,在doPost方法中: boolean isMultipart=ServletFileUpload.isMultipartContent(请求); if(isMul

我遵循commons文件上传站点提供的关于流式API的示例。我一直在试图弄清楚如何获取上传文件的文件扩展名,如何将文件写入目录,最糟糕的是编写示例注释的人在哪里处理输入流…,这让我怀疑这是否是一件如此琐碎的事情,以至于我是唯一一个不知道如何处理的人

在HTML文件中使用此选项:


UploadController
servlet中,在
doPost
方法中:

boolean isMultipart=ServletFileUpload.isMultipartContent(请求);
if(isMultipart){
FileItemFactory=new DiskFileItemFactory();
ServletFileUpload upload=新的ServletFileUpload(工厂);
试一试{
列表项=upload.parseRequest(请求);
迭代器迭代器=items.Iterator();
while(iterator.hasNext()){
FileItem=(FileItem)迭代器.next();
如果(!item.isFormField()){
字符串文件名=item.getName();
字符串root=getServletContext().getRealPath(“/”);
文件路径=新文件(根+“/上载”);
如果(!path.exists()){
布尔状态=path.mkdirs();
}
文件上传文件=新文件(路径+“/”+文件名);
System.out.println(uploadedFile.getAbsolutePath());
item.write(上传文件);
}
}
}捕获(文件上载异常){
e、 printStackTrace();
}捕获(例外e){
e、 printStackTrace();
}
}

这是一个Servlet,它完成了您希望它完成的任务

package rick;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.util.*;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.annotation.WebServlet; 
@WebServlet("/upload4")
public class UploadServlet4 extends HttpServlet{
  protected void doPost(HttpServletRequest request, HttpServletResponse response) 
         throws ServletException, IOException {
       PrintWriter out = response.getWriter();
       out.print("Request content length is " + request.getContentLength() + "<br/>"); 
       out.print("Request content type is " + request.getHeader("Content-Type") + "<br/>");
       boolean isMultipart = ServletFileUpload.isMultipartContent(request);
       if(isMultipart){
                  ServletFileUpload upload = new ServletFileUpload();
           try{
               FileItemIterator iter = upload.getItemIterator(request);
               FileItemStream item = null;
               String name = "";
               InputStream stream = null;
               while (iter.hasNext()){
                                     item = iter.next();
                                     name = item.getFieldName();
                                     stream = item.openStream();
                  if(item.isFormField()){out.write("Form field " + name + ": " 
                                           + Streams.asString(stream) + "<br/>");}
                  else {
                      name = item.getName();
                      System.out.println("name==" + name);
                      if(name != null && !"".equals(name)){
                         String fileName = new File(item.getName()).getName();
                         out.write("Client file: " + item.getName() + " <br/>with file name "
                                                    + fileName + " was uploaded.<br/>");
                         File file = new File(getServletContext().getRealPath("/" + fileName));
                         FileOutputStream fos = new FileOutputStream(file);
                         long fileSize = Streams.copy(stream, fos, true);
                         out.write("Size was " + fileSize + " bytes <br/>");
                         out.write("File Path is " + file.getPath() + "<br/>");
                      }
                  }
               }
           } catch(FileUploadException fue) {out.write("fue!!!!!!!!!");}
       } 
  }
} 
package;
导入javax.servlet.*;
导入javax.servlet.http.*;
导入java.io.*;
导入org.apache.commons.fileupload.*;
导入org.apache.commons.fileupload.util.*;
导入org.apache.commons.fileupload.servlet.ServletFileUpload;
导入javax.servlet.annotation.WebServlet;
@WebServlet(“/upload4”)
公共类UploadServlet4扩展了HttpServlet{
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
PrintWriter out=response.getWriter();
out.print(“请求内容长度为”+Request.getContentLength()+”
); out.print(“请求内容类型为”+Request.getHeader(“内容类型”)+“
”); 布尔值isMultipart=ServletFileUpload.isMultipartContent(请求); if(isMultipart){ ServletFileUpload upload=新建ServletFileUpload(); 试一试{ FileItemIterator iter=upload.getItemIterator(请求); FileItemStream item=null; 字符串名称=”; InputStream=null; while(iter.hasNext()){ item=iter.next(); name=item.getFieldName(); stream=item.openStream(); 如果(item.isFormField()){out.write(“表单字段”+名称+”:“ +Streams.asString(stream)+“
;”;} 否则{ name=item.getName(); System.out.println(“name==”+name); 如果(name!=null&&!“.equals(name)){ 字符串文件名=新文件(item.getName()).getName(); out.write(“客户端文件:”+item.getName()+“
带有文件名” +文件名+”已上载。
“; File File=新文件(getServletContext().getRealPath(“/”+fileName)); FileOutputStream fos=新的FileOutputStream(文件); long fileSize=Streams.copy(stream,fos,true); write(“大小为“+文件大小+”字节
”; out.write(“文件路径为“+File.getPath()+”
); } } } }catch(FileUploadException fue){out.write(“fue!!!!!!!!!!!”);} } } }
有一个很棒的“库”可以为您完成这项工作。它实际上只是一个过滤器的代码示例,它将拦截任何类型为multipart的表单帖子,并允许您访问文件、文件名等。。。您可以在普通的servlet post方法中处理它


所有这些答案的问题在于它没有回答原来的问题

正如它所说的“处理输入流”,它真的让你困惑了下一步该做什么。我整晚都在看这个问题,试图从其中一个答案中找到一个暗示,但什么都没有。我去尝试了其他网站,但什么都没有

问题是,我们所做的超出了文件上传的范围,这就是问题所在

我们现在正在使用Java.IO InputStream

  InputStream stream = item.openStream();
现在我们来处理这个“流”

在这里,你可以找到你需要的各种答案。这是相当愚蠢的,它是如此模糊,并使它看起来像你必须做一些额外的与Commons,但实际上它不是Commons InputStream它的Java.io的

在本例中,我们获取给定的流,并通过读取字节数据上传到新文件

这个网站也有很多可能有用的选项

我希望这能帮助那些对文件上传感到困惑和陌生的人,因为我在写这个答案前几分钟才明白这一点

这是我将文件保存到根驱动器的代码

  try {
            System.out.println("sdfk");

            boolean isMultipart = ServletFileUpload.isMultipartContent(request);


// Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload();

// Parse the request
            FileItemIterator iter = upload.getItemIterator(request);


            while (iter.hasNext())
            {
                FileItemStream item = iter.next();
                String name = item.getFieldName();
                InputStream stream = item.openStream();


                    System.out.println("File field " + name + " with file name "
                            + item.getName() + " detected.");
                    // Process the input stream
                    File f = new File("/"+item.getName());

                 System.out.println(f.getAbsolutePath());

                FileOutputStream fout= new FileOutputStream(f);
                BufferedOutputStream bout= new BufferedOutputStream (fout);
                BufferedInputStream bin= new BufferedInputStream(stream);


                int byte_;

                while ((byte_=bin.read()) != -1)
                {
                     bout.write(byte_);
                }

                bout.close();
                bin.close();


            }       

        } 
        catch (FileUploadException ex)
        {
            Logger.getLogger(UploadServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
        response.sendRedirect("/plans.jsp");
祝你好运

我在这里给出了一个完整的工作示例(一个用于WebLogic的Eclipse项目,但您可以轻松地将其应用于Tomcat)


否则只需git克隆。一个完整的工作示例胜过一千个代码片段。

关于如何实现这一点,有大量的信息