【问题标题】:Unable to receive file contents on server during upload上传期间无法在服务器上接收文件内容
【发布时间】:2011-06-07 14:47:04
【问题描述】:

我有一个 JSP 页面,其中有一个文件输入字段,我从中浏览一个 csv 文件,然后将其上传到服务器上。我在此文件输入字段所在的表单中使用 method = "POST" 和 ENCTYPE='multipart/form-data'。

在 servlet 方面(在应用程序的 servlet 中),我正在使用 apache 的通用文件上传 API-ServletFileUpload API。从该 API 的方法 parseRequest(request) 获取 FileItem 列表后,我无法使用 FileItem API 的 getName()、getString() 方法获取文件名及其内容。

需要知道我做错了什么或对我的方法进行任何修改以使我的应用程序正常工作。任何有关这方面的指示都会有所帮助。

提前致谢!!

还在应用程序主servlet的doPost方法中尝试了以下代码:-

`枚举 enumAttrib = request.getAttributeNames();

    while(enumAttrib.hasMoreElements()) {
        String attribName = (String)(enumAttrib.nextElement());
        System.out.println("DEBUG:---------AttribName = " + attribName);
        System.out.println("DEBUG:---------AttribValue=" + request.getAttribute(attribName));
    }`

打印出来的输出是:

DEBUG:---------AttribName = weblogic.servlet.network_channel.port
DEBUG:---------AttribValue=9703

不知道请求参数是否应该只返回这个或其他属性。

还尝试了以下代码:

if (ServletFileUpload.isMultipartContent(request)) {

        System.out.println("Inside ApplicationMainServlet request is multipart ");

        // Create a factory for disk-based file items
        FileItemFactory factory = new DiskFileItemFactory();

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

        try
        {
            // Parse the request

            List /* FileItem */items = upload.parseReques(request);

            // Process the uploaded items

            Iterator iter = items.iterator();

            while (iter.hasNext())
            {
                FileItem item = (FileItem) iter.next();
                String name = item.getFieldName();

                System.out.println("ApplicationMainServlet name: "+item.getFieldName() + ", val: "+item.getString() );

                if (!item.isFormField())
                {  
                    //Item is a file

                try{

                    InputStream is = item.getInputStream();

                    InputStreamReader ir = new InputStreamReader(is);

                    BufferedReader br = new BufferedReader(ir);

                    System.out.println("br : " + br);

                    String fileContent = "";

                    String strLine;

                    while((strLine = br.readLine()) != null){

                        System.out.println("strLine : " + strLine);

                        if(fileContent != null)
                        {
                            fileContent = fileContent+ strLine + "\n";
                        }
                        else
                        {
                            fileContent = strLine + "\n";
                        }
                    }

                    System.out.println("fileContent : " + fileContent);
                    } catch(Exception e){
                        e.printStackTrace();
                    }

                    System.out.println("ApplicationMainServlet file name " + item.getName()+",size "+item.getSize());                       

                }
            }

【问题讨论】:

  • 可以发一下文件上传代码吗?
  • public void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  • FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload 上传 = new ServletFileUpload(factory);列表项 = upload.parseRequest(request);迭代器 iter = items.iterator(); while (iter.hasNext()){ FileItem item = (FileItem) iter.next(); if (!item.isFormField()) { //在日志中打印的输出是 Val=(blank) and size=0 System.out.println("ApplicationMainServlet: name = "+item.getFieldName() + ", val = "+item.getString() + ", 文件大小 = " + item.getSize() ); request.setAttribute(name, item); //更多代码要遵循..
  • 请使用代码更新您的原始问题。它作为评论是不可读的。并且请使用编辑框上的代码格式化按钮来格式化代码。

标签: jsp servlets


【解决方案1】:

您确定您的doProcess 方法正在被调用吗?您是否在此代码块之前或其中的其他地方放置了任何 System.out 消息?

另外,您如何声明您的文件上传表单?您需要将表单上的enctype 设置为multipart/form-data

<form enctype="multipart/form-data" name="uploadForm" action="uploadFormAction">
</form>

根据Apache documentation,您的代码看起来大部分是正确的

if (!item.isFormField()) {
    System.out.println("ApplicationMainServlet: name = " + item.getFieldName() + ", val = " + item.getString() + ", file size = " + item.getSize());
}

也许更容易阅读:

 if (!item.isFormField()) {
     String fieldName = item.getFieldName();
     String fileName = item.getName();
     long sizeInBytes = item.getSize();
     System.out.println("ApplicationMainServlet: name = " + fieldName + ", val = " + fileName + ", file size = " + sizeInBytes);
 }

试一试,看看它是否有效。

【讨论】:

  • 问题是我无法在服务器端发送文件的内容。我已经完全按照你所说的那样声明了表格。从日志中的 sysout 语句中确认调用 doPost 方法。控件进入 if 条件 (!item.isFormField()) 但当我尝试获取文件名、大小或其内容时,它不会打印任何内容。我还尝试在 FileItem 对象上获取 inputStream 并尝试逐行打印文件的内容,但这也失败了。
  • 我感觉由于文件内容作为 MIME 流发送到服务器,因此检索文件内容的正常方法不起作用。
猜你喜欢
  • 2013-01-28
  • 2013-12-10
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
相关资源
最近更新 更多