struts2 导致文件上传失败

发布于 2022-09-04 21:30:36 字数 4762 浏览 10 评论 0

各位我遇到了问题,具体表现在,当我尝试向服务器上传文件时,服务器无法取得上传文件的信息,当然也不能正常上传文件。
然后我将同样的代码分成两种情况往服务器上传文件,一种是使用struts2的情形,另一种则不启用struts2,我发现不启用struts2能够正常上传文件,而另一种总是失败。
我上网查找过相关问题,知道了一些问题所在,大概就是struts2将页面请求的request对象重新封装了一回,导致上传文件信息的丢失,但是我不能够解决这个问题。http://blogwarning.iteye.com/...
这是我找到的其中一个相似的情况,但是解决方案在我这里行不通。
以下是我的相关代码,希望能得到你们的帮助,感激不尽....

1.表单信息

<form name="form" action="addComInfo.action" method="post"
            enctype="multipart/form-data">
            <label>名称:<input type="text" name="name" /></label><br /> <label>类别:
                <input type="radio" name="category" value="图书" />图书 <input
                type="radio" name="category" value="配件" />配件 <input type="radio"
                name="category" value="其它" />其它
            </label><br /> <label>价格:<input type="text" name="price" /></label><br />
            <label>数量:<input type="text" name="count" /></label><br /> <label>图片:<input
                type="file" name="afile" /></label><br /> <label> <input
                type="submit" value="提交" />
            </label>
        </form>

2.AddInfoAction.java

package com.duxingzhe.defined.filter;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class AddInfoAction extends ActionSupport {

    
    @Override
    public String execute() throws Exception {
        
        return Action.SUCCESS;
    }

}

3.servlet 中的upload()方法

public void upload(HttpServletRequest request, HttpServletResponse response) {
        String message = "";
        String url = this.getServletContext().getRealPath("WEB-INF/upload");
        File file = new File(url);
        if (!file.isDirectory() && !file.exists()) {
            System.out.println("该目录不存在,需要创建");
            file.mkdir();
        }
        System.out.println("url=" + url);
        try {
            DiskFileItemFactory disk = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(disk);
            System.out.println("upload:" + upload.toString());
            upload.setHeaderEncoding("utf-8");
            if (!ServletFileUpload.isMultipartContent(request)) {
                System.out.println("isM false");
                return;
            }
            //items 为[]
            List<FileItem> items = upload.parseRequest(request);
            System.out.println("items:" + items.size());
            Iterator<FileItem> iter = items.iterator();
            // System.out.println("list="+iter.toString());
            // System.out.println(iter.next());
            while (iter.hasNext()) {
                FileItem newItem = iter.next();
                System.out.println("newItem" + newItem.toString());
                if (newItem.isFormField()) {
                    String name = newItem.getFieldName();
                    String value = newItem.getString("utf-8");
                    System.out.println("普通字段");
                    System.out.println("name=" + name + ",value=" + value);
                } else {
                    String filename = newItem.getName(); // 获取上传文件所在路径
                    System.out.println("file字段: " + filename);
                    if (filename == null || filename.trim().equals("")) {
                        continue;
                    }
                    filename = filename.substring(filename.lastIndexOf("\\") + 1);
                    InputStream input = newItem.getInputStream();
                    FileOutputStream fileOut = new FileOutputStream(url + "\\" + filename);
                    byte buffer[] = new byte[1024];
                    int len = 0;
                    while ((len = input.read(buffer)) > 0) {
                        fileOut.write(buffer, 0, len);
                    }
                    input.close();
                    fileOut.close();
                    newItem.delete();
                    message = "文件上传成功!";
                }
            }
        } catch (Exception e) {
            message = "文件上传失败!";
            e.printStackTrace();
        } finally {
            System.out.println(message);
        }
}

4.struts.xml 配置

<action name="addComInfo" class="com.duxingzhe.defined.filter.AddInfoAction"
            method="execute">
            <!-- <interceptor-ref name="addInfo"></interceptor-ref> -->
            <result name="success">/AddShangpinInfo</result>
        </action>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

╰◇生如夏花灿烂 2022-09-11 21:30:36

struts2文件上传,它本身提供了拦截器实现文件的上传,struts2默认拦截器栈就有这个拦截器。

public class AddInfoAction extends ActionSupport {

    //拦截器已经帮你把文件写入到临时文件中。
    private File afile;
    
    //提交过来的file的名字
    private String fileFileName;
    
    //提交过来的file的MIME类型
    private String fileContentType;
    
    @Override
    public String execute() throws Exception {
        处理aFile文件,把aFile保存到自己想保存的地方。
        return Action.SUCCESS;
    }

}

如果不想使用stuts2的,理论上把 Struts2 的 org.apache.struts2.interceptor.FileUploadInterceptor 拦截器关掉,你就可以直接处理上传的操作了。你自己试试看。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文