java - 使用ajax和java进行文件上传

标签 java ajax servlets

嗨,我想使用 ajax 和 Apache Commons File Upload 进行文件上传。在 Servlet 中我有:

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
System.out.println(response.getCharacterEncoding());
response.setCharacterEncoding("UTF-8");
System.out.println(response.getCharacterEncoding());
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.println("wtpwebapps<br/>");
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart) {
    writer.println("<HTML>");
        writer.println("<HEAD <TITLE> Upload4 </TITLE> </HEAD>");
        writer.println("<BODY>");
        writer.println("<FORM action = \"Upload_Servlet\" method = \"post\" enctype = \"multipart/form-data\">");
        writer.println("<INPUT type = file name = ufile>");
        writer.println("<INPUT type = submit value = \"Attach\">");
        writer.println("<h1>its not multipart</h1>");
        writer.println("</FORM>");
        writer.println("</BODY>");
        writer.println("</HTML>");
        return;
    }          
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> list=null;
String mifpath= "1";
String path = " ";
String mif = " ";
String from = "\\\\";
String to ="/";
String error="";
 try{
  list = upload.parseRequest(request);
  Iterator<FileItem> it = list.iterator();
  response.setContentType("text/html");
  while ( it.hasNext() ) 
  {

    FileItem item = (FileItem) it.next();
    File disk = new File("C:/uploaded_files/"+item.getName());

        path = disk.toString();

        String code = new String(path.substring(path.lastIndexOf("."), path.length()).getBytes("ISO-8859-1"),"utf-8");
        if (code.equalsIgnoreCase(".zip"))
        {
            mifpath=path;
            mif = mifpath.replaceAll(from, to);
            item.write(disk);
            error=unzip.unpack(mif, "C:/uploaded_files");
        }
        else
        {
            error = "Выбранный файл не является архивом zip";

        }
  }
}
 catch ( Exception e ) {
  log( "Upload Error" , e);
}
 request.setAttribute("error", error);
 request.getRequestDispatcher("/Home.jsp").forward(request, response);

// String redictedURL="http://localhost:8080/redicted_test/Home.jsp";
// response.sendRedirect(redictedURL);
writer.close();
}
}

但我不知道在客户端做什么。

尝试使用ajaxfileupload库,但没有任何效果。

jsp

<%@ page import="java.sql.DriverManager"%>
<%@ page import="java.sql.Connection"%>
<%@ page import="java.sql.SQLException"%>
<%@ page import="java.sql.Statement"%>
<%@ page import="java.sql.ResultSet"%>


<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>OpenLayers map preview</title>
<link href="http://localhost:8080/geoserver/openlayers/theme/default/style.css"      type="text/css"/>
<link href="fileuploader.css" type="text/css"/>
<script src="jquery.min.js"></script>
<script src="ajaxfileupload.js"></script>
<script src="fileuploader.js"></script>

<style type="text/css"> 
    /*<![CDATA[*/
        div.container {
            width: 100%;
            float: left;
            margin-right: -270px;
            }
        div.content {
            margin-right: 270px;
            }       
        div.info{   
                width: 270px;
                float: right;
                }
        div.clearing {
            height: 0;
            clear: both;
            }
        div.list {background-color:#dddddd; border-right:2px dashed #717dc9; width:250px; float:right; margin-left:10px;height:400}
        div.upload{background-color:#dddddd; height:190px; width:252px; float: right; margin-top:10px }
        div.listtitle {margin-left:10px; background-color:#dddddd}
        div.check {width:50%;float: left}
        div.filelist {overflow: auto; height:310px; margin-left:10px}
        div.upload_int{
        margin-left:10px
        }
        /* General settings */
            body {
                font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
                font-size: small;
                sans-serif; width:700px; margin:100px auto;
                }
        /* The map and the location bar */
            #map {
                clear: both;
                position: relative;
                max-width: 1000px;
                min-width: 100px;
                height: 590px;
                border: 1px solid black;
                }
    /*]]>*/
    </style>
<!-- Import OpenLayers, reduced, wms read only version -->
<script src="Scripts/OpenLayers/OpenLayers.js" type="text/javascript">
</script>
<script defer="defer" type="text/javascript">
var map;
var ch=[];
var tiled;

function init(){
var bounds = new OpenLayers.Bounds(6359825.735024724,6796708.483322172,9197952.978460854,10728325.920322442);
var options = {
    controls: [],
    maxExtent: bounds,
    maxResolution: 156543.0399,
    projection: "EPSG:900913",
    units: 'm'
};
map = new OpenLayers.Map('map', options);

    var fromProjection = new OpenLayers.Projection("EPSG:4326");   // Transform from WGS 1984
    var toProjection   = new OpenLayers.Projection("EPSG:900913");

// setup tiled layer



    osm = new OpenLayers.Layer.OSM( "OpenStreet Maps");

    map.addLayers([osm]);

// build up all controls
map.addControl(new OpenLayers.Control.PanZoomBar({
    position: new OpenLayers.Pixel(2, 15)
}));
map.addControl(new OpenLayers.Control.Navigation());
map.addControl(new OpenLayers.Control.Scale($('scale')));
    map.addControl( new OpenLayers.Control.LayerSwitcher() );
map.addControl(new OpenLayers.Control.MousePosition({element: $('location')}));
map.zoomToExtent(bounds);

        //---------------
        document.getElementById("check").onclick=function(){
        var count = 0;

        var inputs = document.getElementsByTagName('input');
        for (var j = 0; j < inputs.length; j++){
            if (inputs[j].type == 'checkbox')
            {
                count++;

            }
        }

        id=[];
        var doc;
        var i=0;

        //var params;
        var obj_id=" ";
        var or ="or";
        var fin_obj="";
        var filter="";
        var div = document.getElementById("list");
        elements = getElementsByClass('myclass', div);
        var b;
        for(b=0;b<elements.length;b++)
        {
            if(elements[b].checked)
            {id.push(elements[b].getAttribute('value'));
            }
        }
        /*while(++i <= count){
            doc=document.getElementById("check"+i)
            if(doc.checked)
            {checked.push(i);
            id.push(doc.getAttribute('value'));
            }

        }*/
        ch=id;
        for(var k=1;k<id.length;k++)
        {
        obj_id=" "+or+" id="+id[k];
        fin_obj=fin_obj+obj_id;
        }
        filter="id="+id[0]+fin_obj;

        layer.mergeNewParams({CQL_FILTER:filter});

        wms = new OpenLayers.Format.WMSCapabilities();
        OpenLayers.Request.GET({
            //url:"wmsURL&service=WMS&request=GetCapabilities",
            url:"http://localhost:8080/geoserver/wms/filedata?request=GetCapabilities",
            success: function(e){
                console.log(e);
                var response = wms.read(e.responseText);
                var capability = response.capability;
                for (var i=0, len=capability.layers.length; i<len; i+=1) { 
                    var layerObj = capability.layers[i];
                    if (layerObj.name === 'cite:filedata') {
                        extend=OpenLayers.Bounds.fromArray(layerObj.llbbox);
                        map.zoomToExtent(extend.transform(fromProjection,toProjection));
                        break; 
                    } 
                }
            }
        });
        position = new OpenLayers.Bounds(60.67,56.84,60.68,56.87).transform(fromProjection,toProjection);       
        }

    }
//принятие участков
    function accepting()
    {
        for(var k=0;k<ch.length;k++)
        {
              document.getElementById("check"+ch[k]).nextSibling.style.color='black';
        }
         $.post(
            "setStatus.jsp",
            {ids:ch.toString()}
         );
    }
    //удаление участков
    function deleting()
    {
         $.post(
            "deletePoly.jsp",
            {ids:ch.toString()},
           function(per){
          $("#WRAPlist").load("listing.jsp");
            }
          );

    }
    if(document.getElementsByClassName) {
        getElementsByClass = function(classList, node) {    
        return (node || document).getElementsByClassName(classList)
    }
    } else {
        getElementsByClass = function(classList, node) {            
        var node = node || document,
        list = node.getElementsByTagName('*'), 
        length = list.length,  
        classArray = classList.split(/\s+/), 
        classes = classArray.length, 
        result = [], i,j
        for(i = 0; i < length; i++) {
            for(j = 0; j < classes; j++) {
                if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) {
                    result.push(list[i])
                    break
                }
            }
        }
        return result
    }   
}

var er='${error}';
    if (er!="")
{
        alert("${error}");
    }
window.onload = createUploader;
function createUploader(){            
    var uploader = new qq.FileUploader({
        element: document.getElementById('file-uploader-demo1'),
        action: 'Upload_Servlet',
        debug: true,
        allowedExtensions:['jpg', 'jpeg', 'png', 'gif'],
        sizeLimit: 6000000, // max size   
        minSizeLimit: 11024, // min size
        onComplete: function(){
          populate();
        }
    });           
} 
</script>

</head>
<body onload="init()">
<div class="container">
<div class="content">
    <div class="ol"> <div id="map"></div> </div>
    </div>
</div>
<div class="info">
    <div class="list">
    <div class="listtitle">
    <div>
        <h2>Список участков</h2>
    </div>
    <div class="check">
        <input type="button" id="check" value="Отобразить">
    </div>
    <div class="acc">
        <input type="button" id="accept" onclick="accepting()" value="Принять">
    </div>
</div>
<div class="filelist" id="WRAPlist">
<%
Class.forName("org.postgresql.Driver");
Connection conn= null;
conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgis","postgres","123456");
Statement sta = null;
sta = conn.createStatement();
String fileName= "";
Integer fileId=null;
String fileStatus ="";

ResultSet r=sta.executeQuery("SELECT id, name, status FROM filestatus");
String acc="Принят                   ";
while(r.next())
{
    fileId=r.getInt("id");
    fileName=r.getString("name");
    fileStatus=r.getString("status");   
    if(fileStatus.equalsIgnoreCase(acc))
    {
        out.write("<input type='checkbox' class='myclass' id='check"+fileId+"' name='"+fileName+"' value='"+fileId+"'/><label for=check"+fileId+">"+fileName+"</label><br>");   
  }
    else
    {
        out.write("<input type='checkbox' class='myclass' id='check"+fileId+"' name='"+fileName+"' value='"+fileId+"'/><label for=check"+fileId+" style='color:blue'>"+fileName+"</label><br>");

    }
}
r.close();
sta.close();
conn.close();

%>
</div>
 </div>
 <div class="upload">
    <div class="upload_int">
    <h2>Загрузка файлов</h2>
  <form action="" method="post" enctype="multipart/form-data">
   <div id="up">
    <input id="fileUpload1" type="file" name="fileUpload1"value="Browse..."/>
   </div>
   <div>
    <button class="button" id="buttonUpload" onclick="return ajaxFileUpload();">Загрузить</button>
    <input type="button" id="del" onclick="deleting()" value="Удалить">
   </div>
   </form>
   </div>
 <div id="file-uploader-demo1">     
    <noscript>          
        <p>Please enable JavaScript to use file uploader.</p>
        <!-- or put a simple form for upload here -->
    </noscript>

</div>
 </div>
 </div>
 <div class="clearing">&nbsp;</div>
 </body>
 </html>

我在这里出错了还是只是想用另一种方法来解决这个问题?

最佳答案

使用这个jquery插件上传ajax upload

<script>        
        window.onload = createUploader;
        function createUploader(){            
            var uploader = new qq.FileUploader({
                element: document.getElementById('file-uploader'),
                action: 'Upload_Servlet',
                debug: true,
                allowedExtensions:['jpg', 'jpeg', 'png', 'gif'],
                sizeLimit: 6000000, // max size   
                minSizeLimit: 11024, // min size
                onComplete: function(){
                }
            });           
        }


    </script>

它可能不适用于 IE6,但它是一个很棒的插件。

关于java - 使用ajax和java进行文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11240460/

相关文章:

java - Runtime.exec() 的行为不符合预期

ajax - Django 和 AJAX : Delete Multiple Items wth Check Boxes

java - Play Framework - Ajax Web服务调用图像请求问题

java - 将克隆的 Servlet 部署到 Tomcat

java - "architecture-neutral"和 "portable"有什么区别?

java - 如何以编程方式在 jasper 标题中设置图像

java - 如何在没有错误 ArrayIndexOutOfBoundsException 的情况下实现具有 4 向分区的合并排序算法?

javascript - jQuery.ajax 和 Rickshaw - 回调函数?

java - Servlet 内的静态类用法

java - 如何在 JSF 应用程序中注销