zoukankan      html  css  js  c++  java
  • html5 file upload and form data by ajax

    html5 file upload and form data by ajax

    最近接了一个小活,在短时间内实现一个活动报名页面,其中遇到了文件上传。
    我预期的效果是一次ajax post请求,然后在后台java restlet的下面一次解决文件上传和form表单的处理。一次搞定问题。当然这是我的预期,真正实现起来还是不太顺利。

    在网上很有很多文件上传的例子(尝试了uploadify,ajaxfileupload),可是很遗憾,在我这里好像都没有成功!
    苦于自己的javascript水平太菜,也没有带多的精力来弄,
    然后在google的帮助下 在这里这里这里的指引下,终于可以实现我要的效果.

    ajax post => form + file (formdata) => restlet后台处理

    期间也简单了解了一下rf1867, 以及老赵的blog

    下面具体说说代码部分。

    html部分:

    <html>
     <header>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
    </header>
    <body>
    <h1>*****Upload File with RESTFul WebService*****</h1>
    <form id = "myform" >
    
    
        <fieldset>
            <legend>Upload File</legend>
    
            <input type="file" id ="fileToUpload" name="fileToUpload"/><br />  
            <br /><br />
            Party ID<input type="text" id = "partyid" name="partyid"  /><br />
    
    
            <a id="submit" href="javascript:void(0);" >提交</a>
        </fieldset>
    </form>
    <script type="text/javascript">
    
    $("#submit").click( function(){
    	var partyid = $("#partyid").val();
        var fileToUpload = $("#fileToUpload").val();
        var options = {
                'event': 'xxxx2015',
                'info': {
                    'partyid': partyid,
                    'fileToUpload': fileToUpload,
                }
            };
        //file upload
        console.log($("#myform").serialize())
        console.log(fileToUpload)
        console.log(partyid)        
        var formData = new FormData();
        formData.append( 'fileToUpload',  $( '#fileToUpload' )[0].files[0] ); 
        formData.append( 'partyid', partyid);
        $.ajax({
            url: '../restful/v1.0/api/app/enroll/upload?token=JA1mqLiXDgcZ0ijJhE9R',
            type: "POST",
            contentType: false,
            cache: false,
            processData: false,
            data: formData,
            dataType: "json",
            success: function (res) {                	
                if (res.status) {
                    alert('注册成功!电子票已发送到你的手机/邮箱');
                    console.log(res);
                } else {
                    switch (res.message) {
                        case 'hasApplied':
                            $('#user_info').text('');
                            alert('您已报名过此次大会,无需重复报名');
                            
                            break;
                        default :
                            console.log(res.message);
                            alert('啊哦~图片提交失败,请重启提交');
                            break;
                    }
                }
            }, error: function (res) {
                alert('啊哦~图片提交失败,请重启提交');
                
            }
        });
    });
       
        		
    </script>
    </body>
    

    最主要是是ajax中这三行:

    contentType: false,
    cache: false,
    processData: false,
    

    后台代码部分 springmvc + restlet:

    public class EnrollFileUploadResource extends ServerResourceBase{
     private static Logger logger = Logger.getLogger(EnrollFileUploadResource.class.getName());
    
     private EnrollRegisterService enrollRegisterService;
     String parameter="";
     @Override
     protected void doInit() throws ResourceException {
          logger.info("开始执行");
          super.doInit();
     }
     @Post
     public Representation createTransaction(Representation entity) {
         Representation rep = null;
         JSONObject json=new JSONObject();
         if (entity != null) {
             if (MediaType.MULTIPART_FORM_DATA.equals(entity.getMediaType(), true)) {
                 // 1/ Create a factory for disk-based file items
                 DiskFileItemFactory factory = new DiskFileItemFactory();
                 factory.setSizeThreshold(1000240);
    
                 // 2/ Create a new file upload handler
                 RestletFileUpload upload = new RestletFileUpload(factory);
                 List<FileItem> items;
                 try {
                    Request req = getRequest();
                     // 3/ Request is parsed by the handler which generates a list of FileItems
                     items = upload.parseRequest(req);
    
                     Map<String, String> props = new HashMap<String, String>();
                     File file = null;
                     String filename = null;
    
                     for (final Iterator<FileItem> it = items.iterator(); it.hasNext(); ) {
                         FileItem fi = it.next();
                         String name = fi.getName();
                         if (name == null) {
                             props.put(fi.getFieldName(), new String(fi.get(), "UTF-8"));
                         } else {
                              
                              
                              try {
                                        String tempDir = getClass().getClassLoader().getResource("").getPath();
                                        tempDir = tempDir.substring(0,tempDir.lastIndexOf("WEB-INF"));
                                        String osName = System.getProperty("os.name");
                                        if(osName.toLowerCase().indexOf("windows")>-1){
                                             tempDir = tempDir.substring(1, tempDir.length());
                                        }
                                        String uploadingPath = tempDir + "static" + File.separatorChar +"uploading";
                                        File f = new File(uploadingPath);
                                        if (!f.exists()) {
                                             f.mkdirs();
                                        }
    
                                        
                                        String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
                                        String str=name.substring(name.lastIndexOf("."));
                                        filename = time + RandomUtil.getStringCode(8)+str;
                                        file = new File(uploadingPath+ File.separator+ filename);
                                        fi.getInputStream();
                                        fi.write(file);
                                        props.put("image", filename);
                                   } catch (Exception e) {
                                        e.printStackTrace();
                                        json.put("status", false);
                                        json.put("message","fileUploadFail"); // 已经报过名了
                                   }
                         }
                     }
    
                     // [...] my processing code
                     EnrollUser user =new EnrollUser();
                    user.setEvent(props.get("event"));
                    user.setUserName(props.get("userName"));
                    user.setMobile(props.get("mobile"));
                    。。。
                    user.setImage(props.get("image"));
                    
                    user.setCreate_time(TimeUtil.getNowTimeByPattern(TimeUtil.DATE_DEFAULT_PATTERN));
               
                    
                    if(enrollRegisterService.hasEnrolled(user))
                    {
                         json.put("status",false);
                         json.put("message","hasApplied"); // 已经报过名了
                    }
                    else
                    {
                         enrollRegisterService.saveOrUpdateData(user);
                         json.put("status",true);
                         json.put("info","成功");
                    }              
    
                 } catch (Exception e) {
                     // The message of all thrown exception is sent back to
                     // client as simple plain text
                     getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
                     e.printStackTrace();
                     rep = new StringRepresentation(e.getMessage(), MediaType.TEXT_PLAIN);
                 }
             } else {
                 // other format != multipart form data
                 getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
                 rep = new StringRepresentation("Multipart/form-data required", MediaType.TEXT_PLAIN);
             }
         } else {
             // POST request with no entity.
             getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
             rep = new StringRepresentation("Error", MediaType.TEXT_PLAIN);
         }
        
         json.put("status",true);
         return new StringRepresentation(json.toString());
     }
    
     public void setEnrollRegisterService(EnrollRegisterService enrollRegisterService) {
          this.enrollRegisterService = enrollRegisterService;
     }
     
     }
    

    完毕。

    至于配置springmvc +restlet的配置环境如何,这里就不再说明。

    如有问题,欢迎讨论。

  • 相关阅读:
    “XXXXX” is damaged and can’t be opened. You should move it to the Trash 解决方案
    深入浅出 eBPF 安全项目 Tracee
    Unity3d开发的知名大型游戏案例
    Unity 3D 拥有强大的编辑界面
    Unity 3D物理引擎详解
    Unity 3D图形用户界面及常用控件
    Unity 3D的视图与相应的基础操作方法
    Unity Technologies 公司开发的三维游戏制作引擎——Unity 3D
    重学计算机
    windows cmd用户操作,添加,设备管理员组,允许修改密码
  • 原文地址:https://www.cnblogs.com/jerrychen/p/4771214.html
Copyright © 2011-2022 走看看