struts如何为上传的文件设置特定名称

时间:2014-04-29 04:26:58

标签: java file-upload struts2 filenames

我想为目标文件夹中的上传文件指定具体名称..这是我的动作文件代码..这里我想给出CPIC_1.jpg,CPIC_2.jpg,CPIC_3.jpg,CPIC_4.jpg等名称但每次分配名称:CPIC_1.jpg ..所以我如何声明变量ext,以便通过它将是不同的..

CommercialFileBean b = (CommercialFileBean) form;
FormFile f = b.getF();
String s = request.getParameter("action");
HttpSession session = request.getSession(false);
String n = (String) session.getAttribute("str");
String email = session.getAttribute("uname").toString();
String status = (String) session.getAttribute("status");
String type = request.getParameter("type");
String pid;
long ext=0;
int id;
if (s.equalsIgnoreCase("finish")) {
    return mapping.findForward(next);
} else {   /// first else
    String a = getServlet().getServletContext().getRealPath("/");
    File file = new File(a + "uploaded/CPIC_"+ ++ext+".jpg");
    if (!file.exists()) {
        FileOutputStream out = new FileOutputStream(file);
        out.write(f.getFileData());
        out.close();
    }
    try {

        if (n.equalsIgnoreCase("rent")) {
            Session sess = UtilClass.createSession();
            Transaction tx = sess.beginTransaction();
            if (status.equalsIgnoreCase("new")) {
                String sql1 = "select MAX(id) from Rentcommercialrecord where loginid=:email";
                Query q1 = sess.createQuery(sql1);
                q1.setParameter("email", email);
                //  JOptionPane.showMessageDialog(null, "max id is :");
                List<Rentcommercialrecord> l = q1.list();
                Rentcommercialrecord rc = l.get(l.size()-1);
                id = rc.getId();
            } else {
                pid = (String) session.getAttribute("id");
                id = Integer.parseInt(pid);
            }
            JOptionPane.showMessageDialog(null, " latest id is :" + id);
            if (type.equalsIgnoreCase("frontpic")) {
                try {
                    String file1 = f.getFileName();
                    JOptionPane.showMessageDialog(null, "file name is : "+file1);
                    Rentcommercialrecord rc1 = (Rentcommercialrecord) sess.get(Rentcommercialrecord.class, id);
                    rc1.setImg1("CPIC_" +ext+".jpg");
                    sess.update(rc1);
                   // JOptionPane.showMessageDialog(null, "img1");

                } // img1 try ends
                catch (Exception e) {
                    JOptionPane.showMessageDialog(null, "Second error is : " + e.getMessage());
                }
            } // fontpic if ends
            else {
                try {

                    String file1 = f.getFileName();
                    JOptionPane.showMessageDialog(null, "file name is : "+file1);
                    Rentcommercialrecord rc1 = (Rentcommercialrecord) sess.get(Rentcommercialrecord.class, id);
                    rc1.setImg2("CPIC_" +ext+".jpg");
                    sess.update(rc1);
                   // JOptionPane.showMessageDialog(null, "img2");

                } // img2 try ends
                catch (Exception e) {
                    JOptionPane.showMessageDialog(null, "Second error is : " + e.getMessage());
                }
            }   // else img2 ends

            // l.size if ends
            tx.commit();
        }

3 个答案:

答案 0 :(得分:0)

将变量ext设为static

static long ext = 0;

这将使变量对所有实例都通用。

注意:您需要在重新启动期间将此值存储在db / file中的某个位置,并在应用程序启动期间将其保存,以使其与应用程序重新启动时保持一致

答案 1 :(得分:0)

您可以制作ext变量static

注意:静态变量的范围适用于当前类Loader。即,如果使用了diff类加载器,这将会改变。

其他选项是将ext值存储在session中,并且每次上传新图像文件时,从会话中获取此值并使用它。而且您还需要将新值重新放入会话中。这种方法适用于每个用户。即如果您的应用程序具有diff用户,对于diff用户,它将具有基于会话的差异值

答案 2 :(得分:0)

您可以使用静态变量,但通过应用程序重新启动它将不一致。

我会更改方法并读取文件名,然后从名称中提取数字,获取最高数字,递增数据然后再写入新文件。

使用Apache Commons避免重新发明轮子。

开球示例:

String path = getServlet().getServletContext().getRealPath("/") + "uploaded/";
String partialName = "CPIC_";    
int markerLength = partialName.length();
int maxValue = 0;

// Find all files, if any, with name starting with "CPIC_" in the desired folder
List<File> files = FileUtils.listFiles(new File(path), 
                                       new PrefixFileFilter(partialName), 
                                       null);

if (!files.isEmpty()){
    for (File file : files) {
        // Strip marker and extension
        int num = Integer.parseInt(
                     file.getName().substring(markerLength,
                                              file.getName().indexOf("."))
                  );
        // compare the number, if greater, set as new max value
        if (num > maxValue) {
            maxValue = num;
        }
    }
}

String newFile = partialName + ++maxValue + ".jpg";
System.out.println("Next file name would be : " + newFile);