ajax实现图片上传

<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=utf-8"%>
<!DOCTYPE html>
<html>
 <head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta http-equiv=Content-Type content="text/html; charset=utf-8" />
<title>单张图片上传</title>
 <link rel="stylesheet" type="text/css" href="../CSS/uploadImg.css">
    <link rel="stylesheet" href="../CSS/bootstrap.min.css">
  <script src="../js/jquery-3.2.1.js"></script>
<style type="text/css">
 </style>
</head>
<body>
     <div style="height: 500px;">
         <div class="img-box">
             <img src="" id="yushow"/>
             <button class="btn-uploading" οnclick="uploadBtn();"><i class="icon-uploading"></i>上传图片</button>
             <a class="shan" οnclick="deleteImg();">删除</a>
         </div>
         <input type="file" name="file" style="display:none;" οnchange="previewImg(this);" id="upload" accept="image/*"/>
     </div>
 </body>
 <script type="text/javascript">
 
 function uploadBtn(){
     $("#upload").click();
 }
 
 //图片预览
 function previewImg(imgFile){
     console.log(imgFile);//这里打印出是整个input标签
     var extension = imgFile.value.substring(imgFile.value.lastIndexOf("."),imgFile.value.length);//扩展名
    // console.log(extension);
     extension = extension.toLowerCase();//把文件扩展名转换为小写
     if ((extension!='.jpg')&&(extension!='.gif')&&(extension!='.jpeg')&&(extension!='.png')&&(extension!='.bmp')){
         layer.msg("对不起,系统仅支持标准格式的照片,请您调整格式后重新上传,谢谢 !");
         $(".btn-uploading").focus();//将焦点定位在文件上传的按钮上,可以直接按确定键再次触发
     }else{
         var path;//预览地址
         if(document.all){//IE
             imgFile.select();
                 path = document.selection.createRange().text;
                 //alert("if"+path);
         }else{//火狐,谷歌
             path = window.URL.createObjectURL(imgFile.files[0]);
         }
         $("#yushow").attr("src",path);//设置预览地址
         uploadImg(imgFile);
     }
 }
 
 //开始上传
 function uploadImg(imgFile){
     //获取图片文件
     var file = imgFile.files[0];//文件对象,文件的名称
     var name = file.name;//图片名
     //var size = file.size;//图片大小
     //var type = file.type;//文件类型
     //检测浏览器对FileReader的支持
     if(window.FileReader) {
         var reader = new FileReader();
         reader.onload = function(){//异步方法,文件读取成功完成时触发
             var dataImg = reader.result;//文件一旦开始读取,无论成功或失败,实例的 result 属性都会被填充。如果读取失败,则 result 的值为 null ,否则即是读取的结果
             syncUpload(name,dataImg);
         };
         reader.readAsDataURL(file);//将文件读取为 DataURL
     }else {
         layer.msg("浏览器不支持H5的FileReader!");
     }
 }
 
 function syncUpload(name,dataImg){
     var imgFile = dataImg.replace(/\+/g,"#wb#");//将所有“+”号替换为“#wb#”
     imgFile = imgFile.substring(imgFile.indexOf(",")+1);//截取只保留图片的base64部分,去掉了data:image/jpeg;base64,这段内容
     imgFile = encodeURIComponent(imgFile);//把字符串作为 URI 组件进行编码。后台容器会自动解码一次
      name = encodeURIComponent(encodeURIComponent(name));//这里对中文参数进行了两次URI编码,后台容器自动解码了一次,获取到参数后还需要解码一次才能得到正确的参数内容
      var mydata = "method=uploadImg&imgFile="+imgFile+"&imgName="+name;
      $.ajax({
            url: "../CarousePicServlet",
           data: mydata,
            type: "post",
           dataType: "json",
           success: function(data){
                   if(data.state == 'ok'){
                        document.getElementById("upload").value = "";//重置文件域
                       layer.msg(data.msg);
                 }else if(data.state == 'error'){
                     layer.msg(data.msg);
                 }
           }
     });
 }
 
 //删除图片
 function deleteImg(){
     $.ajax({
           url: "../CarousePicServlet",
           data: "method=deleteImg",
           type:"post",
           dataType: "json",
           success: function(data){
                   if(data.state == 'ok'){
                       layer.msg(data.msg);
                 }else if(data.state == 'error'){
                     layer.msg(data.msg);
               }
          }
    });
}
</script>

</html>


我的Servlet代码如下:

package indexServlet;


import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.sql.SQLException;


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import sun.misc.BASE64Decoder;


import net.sf.json.JSONObject;


import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;
@WebServlet("/CarousePicServlet")
public class CarousePicServlet extends HttpServlet {


public CarousePicServlet() {
super();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
doPost(request, response);
}




public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

        try {
              String method = request.getParameter("method");
              if (method != null) {
                  if (method.equals("uploadImg")) {
                      this.uploadImg(request,response);
                  }else if (method.equals("deleteImg")) {
                      this.deleteImg(request, response);
                  }
              }else {//当不能从request中直接获取到数据的时候需要从流中读取
                  try {
                      BufferedReader br = request.getReader();
                      String line = null;
                      StringBuffer sb = new StringBuffer();
                      while((line = br.readLine())!=null){
                          sb.append(line);
                      }
                      String params = sb.toString();
                      if(params.contains("method")){                
                          request.setAttribute("params", params);
                          if (params.contains("uploadImg")){                            
                              this.uploadImg(request,response);
                          } else if (params.contains("deleteImg")){
                              this.deleteImg(request, response);
                          } 
                          return;
                      } else {
                          response.getWriter().print("missing parameter 'method'!");
                     }
                 } catch (Exception e) {
                     e.printStackTrace();
                 } finally {
                     try {
                         response.getWriter().close();
                     } catch (Exception e) {}
                 }
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
}  
        /**
     * 上传图片
      * @param request
        76      * @param response
        77      */
     private void uploadImg(HttpServletRequest request,HttpServletResponse response) {
         try {
             System.out.println("=================《《图片开始上传》》===================");
             response.setContentType("text/html;charset=utf-8");
             String imgFile = request.getParameter("imgFile");
             String imgName = request.getParameter("imgName");
             
             //request中没获取到参数时的处理
             if (imgFile == null  || imgName == null ) {
                 String params = (String)request.getAttribute("params");
                 if (params != null && imgFile == null && params.indexOf("imgFile=") != -1){
                     imgFile = params.substring(params.indexOf("imgFile=") + "imgFile=".length(), params.indexOf("&imgName="));                   
                 }else {
                     System.out.println("imgFile参数错误");
                     response.getWriter().print(JSONObject.fromObject("{'state':'error','msg':'imgFile参数错误'}").toString());
                     return;
                 }
                 if (params != null && imgName == null && params.indexOf("imgName=") != -1) {
                     imgName = params.substring(params.indexOf("imgName=") + "imgName=".length());
                 }else {
                     System.out.println("imgName参数错误");
                     response.getWriter().print(JSONObject.fromObject("{'state':'error','msg':'imgName参数错误'}").toString());
                     return;
                 }
             }
             //对参数为空进行判断
             if ("".endsWith(imgFile.trim()) || "".endsWith(imgName.trim())) {
                 System.out.println("参数为空");
                 response.getWriter().print(JSONObject.fromObject("{'state':'error','msg':'参数为空'}").toString());
                 return;
             }
             
             imgName = URLDecoder.decode(imgName,"utf-8");//前面进行了两次编码,这里需要用解码器解码一次
             //String path = "/site/images"+File.separator+imgName;//Linux文件保存路径
             String path = "F:\\site\\images"+File.separator+imgName;//Windows文件保存路径
             
             //File file = new File("/site/images");
             File file = new File("F:\\site\\images");
             if(!file.exists() && !file.isDirectory()){//如果文件夹不存在则创建 
                 System.out.println("文件目录不存在,开始创建");
                 //file.mkdirs();//生成所有目录
                 //file.mkdir();//生成最后一层目录
                 if (!file.mkdirs()) {
                     System.out.println("文件目录创建失败");
                     response.getWriter().print(JSONObject.fromObject("{'state':'error','msg':'文件目录创建失败'}").toString());
                     return;
                 }
             }
             
             FileOutputStream os = new FileOutputStream(path);
             imgFile = imgFile.replaceAll("#wb#", "+");
             BASE64Decoder decoder = new BASE64Decoder();
             byte[] b = decoder.decodeBuffer(imgFile);
             for(int i=0;i< b.length;++i){
                 if(b[i]< 0){//调整异常数据
                     b[i]+=256;
                 }
             }
             InputStream is = new ByteArrayInputStream(b);
             int len = 0;
             while((len=is.read(b))!=-1){
                 os.write(b,0,len);
             }
             os.close();
             is.close();
             System.out.println("上传成功,文件保存在:"+path);
             response.getWriter().print(JSONObject.fromObject("{'state':'ok','msg':'上传成功'}").toString());
         } catch (Exception e) {
             e.printStackTrace();
             try {
                 response.getWriter().print(JSONObject.fromObject("{'state':'error','msg':'"+e.getMessage()+"'}").toString());
             } catch (IOException e1) {
                 e1.printStackTrace();
             }
         }
         
    }
     /**
     * 删除图片
      * @param request
      * @param response
      */
     private void deleteImg(HttpServletRequest request,HttpServletResponse response) {
         try {
             System.out.println("=================《《图片开始删除》》===================");
             String path = request.getParameter("path");
             if (path == null || "".endsWith(path.trim())) {
                 System.out.println("path参数错误");
                 response.getWriter().print(JSONObject.fromObject("{'state':'error','msg':'path参数错误'}").toString());
                 return;
             }
             //删除文件
             File file = new File(path);
             //路径存在并且为文件则进行删除  
             if (file.exists() && file.isFile()) {  
                 file.delete();
                 System.out.println("删除成功,文件路径:"+path);
                 response.getWriter().print(JSONObject.fromObject("{'state':'ok','msg':'删除成功'}").toString());
             }
         } catch (Exception e) {
             e.printStackTrace();
             try {
                 response.getWriter().print(JSONObject.fromObject("{'state':'error','msg':'"+e.getMessage()+"'}").toString());
             } catch (IOException e1) {
                 e1.printStackTrace();
             }
         }
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用jQuery和Ajax实现批量上传图片。以下是一个简单的示例代码: HTML部分: ```html <input type="file" id="fileInput" multiple> <button id="uploadBtn">上传</button> <div id="preview"></div> ``` JavaScript部分: ```javascript $(document).ready(function() { // 当选择文件发生改变时 $('#fileInput').on('change', function() { var files = $(this)[0].files; for (var i = 0; i < files.length; i++) { var reader = new FileReader(); reader.onload = function(e) { // 在预览区域显示图片 $('#preview').append('<img src="' + e.target.result + '">'); } reader.readAsDataURL(files[i]); } }); // 点击上传按钮时 $('#uploadBtn').on('click', function() { var files = $('#fileInput')[0].files; var formData = new FormData(); for (var i = 0; i < files.length; i++) { formData.append('images[]', files[i]); } // 发送Ajax请求上传图片 $.ajax({ url: 'upload.php', // 替换为你的上传处理脚本地址 type: 'POST', data: formData, processData: false, contentType: false, success: function(response) { // 处理上传成功后的逻辑 console.log(response); }, error: function(xhr, status, error) { // 处理上传失败后的逻辑 console.log(xhr.responseText); } }); }); }); ``` 请注意,上述代码中的上传处理脚本地址应替换为你自己的服务器端脚本地址。服务器端脚本可以接收上传的图片文件,并进行相应的处理,如保存到服务器或存储到数据库等。 这是一个基本的示例,你可以根据自己的需求进行扩展和修改。希望对你有帮助!如果还有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值