• spring mvc 图片上传,图片压缩、跨域解决、 按天生成文件夹 ,删除,限制为图片代码等相关配置


    spring mvc 图片上传,跨域解决 按天生成文件夹 ,删除,限制为图片代码,等相关配置

    fs.root=data/
    #fs.root=/home/dev/fs/
    #fs.root=D:/fs/
    #fs.domains=182=http://172.16.100.182:18080,localhost=http://localhost:8080
    


    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans default-lazy-init="false" default-autowire="no">
    
    <!-- 图片上传配制 -->
    <bean id="fileUpload" class="com.xyt.gsm.utils.FileUpload"> 
     <!-- 是否启用temp文件文件夹  -->
     <property name="UploadTemp" value="false"/>  
     <!-- 是否相对路径 -->
     <property name="RELATIVE_SAVE" value="true"/>
     <!-- 限制大小 -->
     <property name="photoSize" value="2097152"/>
     <property name="otherSize" value="100000000"/> 
     <!-- 文件真实存放文件夹  远程server存放路径 /gsm/fs/-->
     <!-- <property name="realFilePath" value="smb://gsm:gsm1234@172.16.100.182/home/"/> -->
     <!-- 文件真实存放文件夹  本地server存入-->
     <property name="realFilePath" value="${fs.root}"/> 
     <!-- 文件暂时文件夹 -->
     <!--  <property name="UPLOADDIR" value="fs/temp/"/> -->
    </bean>
     
    <bean id="fileUploadServiceImp" class="com.xyt.gsm.service.fs.imp.FileUploadServiceImp">
     	<property name="productPhotoService" ref="productPhotoServiceImp"></property>
     	<property name="dictService" ref="dictService"></property>
    </bean>
     <!-- 绝对路径要在tomcat 做下面映射 -->
    <!--  <Context path="/fs" docBase="d:/fs" /> -->
    </beans>

    package com.xyt.gsm.utils;
    
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.MalformedURLException;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Random;
    import java.util.UUID;
    
    import javax.imageio.ImageIO;
    import javax.servlet.http.HttpServletRequest;
    
    import jcifs.smb.SmbException;
    import jcifs.smb.SmbFile;
    import jcifs.smb.SmbFileOutputStream;
    
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.multipart.MultipartHttpServletRequest;
    import org.springframework.web.multipart.commons.CommonsMultipartResolver;
    
    import com.xyt.gsm.constant.Fs;
    import com.xyt.gsm.constant.Fs.UpoladStatus;
    
    /**
     * 图片上传
     * 
     * @author liangrui
     * 
     *         UploadTemp 假设为false 暂时所在文件夹被实际文件夹替换,假设为true 须要再做一次拷贝
     * 
     */
    public class FileUpload
    {
    
    	// 文件信息
    	/** 是否启用暂时文件文件夹 */
    	private static boolean UploadTemp = false;
    	/** 文件上传相对 路径 */
    	private static String RELATIVEPATH = "relativePath";
    	/** 文件上传绝对 路径文件夹 */
    	private static String ABSOLUTEPATH = "absolutePath";
    	/** 实际文件所在文件夹 */
    	private static String realFilePath = "fs/";
    	/** 文件上传暂时所在文件夹 */
    	public static String UPLOADDIR = "fs/temp/";
    	/** 图片上传限制大小 */
    	public static Integer photoSize = 2097152;//
    	/** 末知类型文件上限制大小 */
    	private static Integer otherSize = 100000000;
    	/** 是否存放相对路径 **/
    	private static boolean RELATIVE_SAVE = false;
    
    	// fied
    	public void setUploadTemp(boolean uploadTemp)
    	{
    		UploadTemp = uploadTemp;
    	}
    
    	public void setPhotoSize(Integer photoSize)
    	{
    		FileUpload.photoSize = photoSize;
    	}
    
    	public void setOtherSize(Integer otherSize)
    	{
    		FileUpload.otherSize = otherSize;
    	}
    
    	public void setRealFilePath(String realFilePath)
    	{
    		if (UploadTemp == false)
    			UPLOADDIR = realFilePath;
    		FileUpload.realFilePath = realFilePath;
    	}
    
    	public void setUPLOADDIR(String uPLOADDIR)
    	{
    		if (UploadTemp == false)
    			UPLOADDIR = realFilePath;
    		else
    			UPLOADDIR = uPLOADDIR;
    
    	}
    
    	public static void setRELATIVE_SAVE(boolean rELATIVE_SAVE)
    	{
    		RELATIVE_SAVE = rELATIVE_SAVE;
    	}
    
    	
    
    	public static String getRealFilePath() {
    		return realFilePath;
    	}
    
    	/**
    	 * 
    	 * @param request
    	 *            上传文件的请求
    	 * @param suffuxDir
    	 *            文件夹分配
    	 * @param type
    	 *            上传文件的类型
    	 * @param cutPhoto
    	 *            是否切图
    	 * @return 上传后的文件路径
    	 * @throws IllegalStateException
    	 * @throws IOException
    	 */
    	// ===============================================================================================
    	// -----解析request 上传 返回上传后的文件把在路径
    	// ================================================================================================
    
    	public static List<String> fileUpload(HttpServletRequest request, String suffuxDir, String type) throws IllegalStateException, IOException
    	{
    
    		return fileUpload(request, suffuxDir, type, false);
    	}
    
    	public static List<String> fileUpload(HttpServletRequest request, String suffuxDir, String type, Boolean cutPhoto) throws IllegalStateException, IOException
    	{
    		// 上传文件的解析器
    		CommonsMultipartResolver mutiparRe = new CommonsMultipartResolver();
    		if (mutiparRe.isMultipart(request))
    		{// 假设是文件类型的请求
    
    			List<String> fileInfo = new ArrayList<String>();
    			MultipartHttpServletRequest mhr = (MultipartHttpServletRequest) request;
    
    			// 按月分文件夹
    			DateFormat df = new SimpleDateFormat("yyyyMM");
    			String month = df.format(new Date());
    
    			// 获取路径
    			String uploadDir = "";
    			if (RELATIVE_SAVE)
    			{
    				uploadDir += (request.getSession().getServletContext().getRealPath("/")+FileUpload.realFilePath);
    			}else
    			{
    				uploadDir += FileUpload.UPLOADDIR ;
    			}
    
    			uploadDir+=(suffuxDir + month + "/");
    			
    			// 假设文件夹不存在,创建一个文件夹
    			if (!new File(uploadDir).exists())
    			{
    				File dir = new File(uploadDir);
    				dir.mkdirs();
    			}
    
    			// 跌带文件名称称
    			Iterator<String> it = mhr.getFileNames();
    			while (it.hasNext())
    			{
    				final MultipartFile mf = mhr.getFile(it.next()); // 获取一个文件
    				if (mf != null)
    				{
    					// 假设是图片类型文件上传 限制大小和类型
    					if (type.equals(Fs.FileUpLoadType.PHOTO))
    					{
    						if (!checkingPhoto(mf))
    						{
    							fileInfo.add(UpoladStatus.类型无效或图片过大.toString());
    							continue;
    						}
    					} else
    					{
    						if (mf.getSize() > otherSize)
    						{
    							fileInfo.add(UpoladStatus.类型无效或图片过大.toString());
    							continue;
    						}
    					}
    					// 其他上传类型 另外做限制推断
    
    					String resFileName = mf.getOriginalFilename();// 获取原文件名称
    					// 取得文件名称和后辍
    					String suffix = "";
    					if (resFileName.indexOf(".") != -1)
    					{
    						suffix = resFileName.substring(resFileName.lastIndexOf(".") + 1);
    					}
    
    					String dian = ".";
    					if ("".equals(suffix))
    						dian = "";
    
    					// 保存的文件名称
    					String uuid = rename();
    					String fileName = uuid + dian + suffix;
    					File outFile = new File(uploadDir + fileName); // 路径加文件名称 +"/"
    					mf.transferTo(outFile); // 保存到
    
    					if (cutPhoto)
    					{
    						final String dirAndUuid = uploadDir + uuid;
    						final String dians = dian;
    						final String suffixs = suffix;
    
    						new Thread(new Runnable()
    						{
    							public void run()
    							{
    								try
    								{
    									copyImgSpecification(mf.getInputStream(), dirAndUuid, dians, suffixs);
    								} catch (IOException e)
    								{
    									e.printStackTrace();
    								}
    							}
    						}).start();
    					}
    
    					if (RELATIVE_SAVE)
    					{// 相对路径文件夹
    						fileInfo.add("/" + FileUpload.realFilePath + suffuxDir + month + "/" + fileName);// 文件路径
    					} else
    					{// 绝对路径文件夹
    						fileInfo.add("/" + suffuxDir + month + "/" + fileName);// 文件路径
    					}
    				}
    			}
    			return fileInfo;
    		}
    		return null;
    	}
    
    	// ------------------------------------------------------------------------------------------------------------
    	// 复制图片 改变不同大小的规格
    	// ------------------------------------------------------------------------------------------------------------
    	public static void copyImgSpecification(InputStream is, String DirAnduuid, String dian, String suffix) throws IOException
    	{
    
    		Image img = ImageIO.read(is);
    		FileOutputStream fos = null;
    		for (int i = 0; i < Fs.FileUpLoadType.changePhotoSize.length; i++)
    		{
    			int w = Fs.FileUpLoadType.changePhotoSize[i];
    			// int h=imgSize[i];
    			String allPath = DirAnduuid + "_" + w + "x" + w + dian + suffix;
    			if ("".equals(suffix))
    			{
    				suffix = "jpg";
    			}
    
    			fos = new FileOutputStream(allPath); // 输出到文件流
    			chagePhotoSize(allPath, img, fos, suffix, w, w);
    		}
    
    		img.flush();
    		// if(fos!=null){fos.close();}
    	}
    
    	// ----------------------------------------------------------------
    	// 检查图片类型上传和图片大小
    	// ----------------------------------------------------------------
    	public static boolean checkingPhoto(MultipartFile mf) throws IOException
    	{
    		if (!isImage(mf.getInputStream()))
    		{ // 推断是否为图片
    			// fileInfo.add("请上传有效图片文件");//提示信息
    			return false;
    		}
    		if (mf.getSize() > photoSize)
    		{
    			// fileInfo.add("图片大于"+(new
    			// DecimalFormat("####.##").format(((double)photoSize)/1024/1024))+"MB上传失败");//提示信息
    			return false;
    		}
    		return true;
    	}
    
    	// 仅仅生成uuid 和后辍分开。切图时须要
    	public static String rename(/* String name */)
    	{
    		// 时分秒
    		/*
    		 * Long now = Long.parseLong(new SimpleDateFormat("yyyyMMddHHmmss") .format(new Date()));
    		 * Long random = (long) (Math.random() * now); String fileName = now + "" + random;
    		 */
    		// 不能设置种子值,应採用默认的方式(系统时间戳 )
    		final Random rd = new Random();
    		final Long random = rd.nextLong();
    		String num = String.valueOf(random);
    		// 限制5个字符
    		int limit = 5;
    		if (num.length() > limit)
    		{
    			num = num.substring(0, limit);
    		}
    		// uuid生成文件名称
    		UUID uuid = UUID.randomUUID();
    		// 加上 5位随机数
    		String uustr = uuid.toString().replace("-", "") + num;
    
    		/*
    		 * if (name.indexOf(".") != -1) { uustr += name.substring(name.lastIndexOf(".")); } else {
    		 * return uustr; }
    		 */
    
    		return uustr;
    	}
    
    	// 更改文件名称称
    	public static String rename(String name)
    	{
    		// 时分秒
    		/*
    		 * Long now = Long.parseLong(new SimpleDateFormat("yyyyMMddHHmmss") .format(new Date()));
    		 * Long random = (long) (Math.random() * now); String fileName = now + "" + random;
    		 */
    		// 不能设置种子值,应採用默认的方式(系统时间戳 )
    		final Random rd = new Random();
    		final Long random = rd.nextLong();
    		String num = String.valueOf(random);
    		// 限制5个字符
    		int limit = 5;
    		if (num.length() > limit)
    		{
    			num = num.substring(0, limit);
    		}
    		// uuid生成文件名称
    		UUID uuid = UUID.randomUUID();
    		// 加上 5位随机数
    		String uustr = uuid.toString().replace("-", "") + num;
    
    		if (name.indexOf(".") != -1)
    		{
    			uustr += name.substring(name.lastIndexOf("."));
    		} else
    		{
    			return uustr;
    		}
    
    		return uustr;
    	}
    
    	// ===============================================================================================
    	// -----推断是否为图片
    	// ================================================================================================
    	public static boolean isImage(File imageFile)
    	{
    		if (!imageFile.exists())
    		{
    			return false;
    		}
    		Image img = null;
    		try
    		{
    			img = ImageIO.read(imageFile);
    			if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0)
    			{
    				return false;
    			}
    			return true;
    		} catch (Exception e)
    		{
    			return false;
    		} finally
    		{
    			img = null;
    		}
    	}
    
    	public static boolean isImage(InputStream imageFile)
    	{
    		Image img = null;
    		try
    		{
    			img = ImageIO.read(imageFile);
    			if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0)
    			{
    				return false;
    			}
    			return true;
    		} catch (Exception e)
    		{
    			return false;
    		} finally
    		{
    			img = null;
    		}
    	}
    
    	// ===============================================================================================
    	// -----删除
    	// ================================================================================================
    	public static int deleteFile(HttpServletRequest request, boolean cutPhoto, String... path) throws MalformedURLException, SmbException
    	{
    		// List<String> delList=new ArrayList<String>();//记录成功删除的文件名称
    		int delcount = 0;
    		// 远程删除
    		if (realFilePath.length() > 3 && realFilePath.substring(0, 3).equals("smb"))
    		{
    			for (String pa : path)
    			{
    				SmbFile remoteFile = new SmbFile(pa);
    				if (remoteFile.exists())
    				{
    					remoteFile.delete();
    					delcount++;
    					// 获取文件名称
    					// delList.add(p.substring(p.lastIndexOf("/")+1));
    				}
    			}
    		} else
    		{
    
    			// 获取当前根文件夹 本地删除
    			String proPath = "";
    			if (RELATIVE_SAVE)
    			{
    				proPath += request.getSession().getServletContext().getRealPath("/");
    			} else
    			{
    				proPath += FileUpload.UPLOADDIR;
    			}
    
    			for (String p : path)
    			{
    				File file = new File(proPath + p);
    				if (file.exists())
    				{
    					file.delete();
    					delcount++;
    					// 获取文件名称
    					// delList.add(p.substring(p.lastIndexOf("/")+1));
    				
    				// 删除小图
    				if (cutPhoto)
    				{
    					Integer[] xPhotoArr = Fs.FileUpLoadType.changePhotoSize;
    					for (Integer imgSize : xPhotoArr)
    					{
    						String suffixs ="";
    						String prefix=p;
    						
    						if(p.indexOf(".")!=-1){
    						 suffixs = p.substring(p.lastIndexOf("."));
    						 prefix = p.substring(0, p.lastIndexOf("."));
    						}
    						String newP = prefix + "_" + imgSize + "x" + imgSize + suffixs;
    						File filex = new File(proPath + newP);
    						if (filex.exists())
    						{
    							filex.delete();
    							delcount++;
    						}
    
    					}
    				}
    				}
    			}
    		}
    		return delcount;
    	}
    
    	/**
    	 * 
    	 * @param request
    	 * @param path
    	 *            暂时图片文件夹
    	 * @param prefixDir
    	 *            前辍文件夹 比方 "商品ID文件夹,商品图片文件夹"
    	 * @return
    	 * @throws IOException
    	 */
    	// -------------------------------------------------------------------------------------------
    	// 把temp的图片文件复制到 真实存放文件文件夹/日期文件夹中
    	// -----------------------------------------------------------------------------------------------
    	public static String tempToupdateImgPath(HttpServletRequest request, String path, String... prefixDir) throws IOException
    	{
    		// 主文件夹
    		String rootDir = request.getSession().getServletContext().getRealPath("/");
    		File file = new File(rootDir + path);// 须要移动的图片
    
    		String realPath = "";// 实际图片地址
    		String dbPath = "";// 保存数据库
    		String fileName = path.substring(path.lastIndexOf("/") + 1);// 文件名称
    		// 加上前辍文件夹
    		StringBuffer appendDir = new StringBuffer();
    		for (String zdir : prefixDir)
    		{
    			appendDir.append(zdir + "/");
    		}
    
    		// smb://username:password@192.168.0.77
    		// 假设是smb远程 上传远程server
    		if (realFilePath.length() > 3 && realFilePath.substring(0, 3).equals("smb"))
    		{
    			dbPath = fileToRemoto(file, fileName, appendDir.toString());
    		} else
    		{
    			// 上传到本地server
    			dbPath = realFilePath + appendDir.toString() + new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/";
    
    			realPath = rootDir + dbPath;
    			if (!new File(realPath).exists())
    			{
    				File dir = new File(realPath);
    				dir.mkdirs();
    			}
    
    			file.renameTo(new File(realPath + fileName));
    		}
    
    		return "/" + dbPath + fileName;
    	}
    
    	// -------------------------------------------------------------------------------------------
    	// 通用smb 传送文件到远程 配制路径 前三个字符为 smb开头
    	// -----------------------------------------------------------------------------------------------
    	private static String fileToRemoto(File file, String fileName, String prefixDir)
    	{
    		InputStream in = null;
    		OutputStream out = null;
    		String returnPath = null;
    		try
    		{
    			// 获取流
    			in = new BufferedInputStream(new FileInputStream(file));
    			String dateDir = new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/";
    			SmbFile remoteFile = new SmbFile(realFilePath + dateDir);
    			// ip+...
    			String fixed = realFilePath.substring(realFilePath.indexOf('@') + 1);
    			returnPath = fixed + prefixDir + dateDir + fileName;
    
    			if (!remoteFile.exists())
    			{
    				remoteFile.mkdirs();
    
    			}
    
    			// 将远程的文件路径传入SmbFileOutputStream中 并用 缓冲流套接
    			String inputFilePath = remoteFile + "/" + fileName;
    
    			// System.out.println("remoteFile:  "+remoteFile);
    			out = new BufferedOutputStream(new SmbFileOutputStream(inputFilePath));
    			byte[] buffer = new byte[1024];
    			while (in.read(buffer) != -1)
    			{
    				out.write(buffer);
    				buffer = new byte[1024];
    			}
    
    		} catch (FileNotFoundException e)
    		{
    			e.printStackTrace();
    		} catch (IOException e)
    		{
    			e.printStackTrace();
    		} finally
    		{
    			try
    			{
    				if (in != null)
    				{
    					in.close();
    				}
    				if (out != null)
    				{
    					out.close();
    				}
    			} catch (IOException e)
    			{
    				e.printStackTrace();
    			}
    		}
    
    		return returnPath;
    	}
    
    	// ----------------------------------------------------------------------------------------
    	// 改变图片大小
    	// --------------------------------------------------------------------------------------
    	private static void chagePhotoSize(final String path, Image src/* FileInputStream is */, FileOutputStream fos, final String format, int w, int h) throws IOException
    	{
    
    		try
    		{
    			int old_w = src.getWidth(null); // 得到源图宽
    			int old_h = src.getHeight(null);
    			int new_w = 0;
    			int new_h = 0; // 得到源图长
    			double w2 = (old_w * 1.00) / (w * 1.00);
    			double h2 = (old_h * 1.00) / (h * 1.00);
    			/**
    			 * BufferedImage(,,) width - 所创建图像的宽度 height - 所创建图像的高度 imageType - 所创建图像的类型
    			 */
    			// 图片跟据长宽留白。成一个正方形图。

    BufferedImage oldpic; if (old_w > old_h) { // BufferedImage.TYPE_INT_RGB; //0-13 oldpic = new BufferedImage(old_w, old_w, 1); } else { if (old_w < old_h) { oldpic = new BufferedImage(old_h, old_h, 1); } else { oldpic = new BufferedImage(old_w, old_h, 1); } } // 改变图片大小 Graphics2D g = oldpic.createGraphics(); g.setColor(Color.white); if (old_w > old_h) { /** * x - 要填充矩形的 x 坐标。

    y - 要填充矩形的 y 坐标。 width - 要填充矩形的宽度。 height - 要填充矩形的高度。 */ g.fillRect(0, 0, old_w, old_w); /** * img - 要绘制的指定图像。

    假设 img 为 null,则此方法不运行不论什么操作。 x - x 坐标。

    y - y 坐标。

    width - 矩形的宽度。 * height - 矩形的高度。

    bgcolor - 在图像非透明部分下绘制的背景色。 observer - 当转换了很多其他图像时要通知的对象。 */ g.drawImage(src, 0, (old_w - old_h) / 2, old_w, old_h, Color.white, null); } else { if (old_w < old_h) { g.fillRect(0, 0, old_h, old_h); g.drawImage(src, (old_h - old_w) / 2, 0, old_w, old_h, Color.white, null); } else { // g.fillRect(0,0,old_h,old_h); /** * getScaledInstance() width - 将图像缩放到的宽度。

    height - 将图像缩放到的高度。

    hints - * 指示用于图像又一次取样的算法类型的标志。

    */ g.drawImage(src.getScaledInstance(old_w, old_h, Image.SCALE_SMOOTH), 0, 0, null); } } g.dispose(); src = oldpic; // 原宽大于指定宽 if (old_w > w) new_w = (int) Math.round(old_w / w2); else new_w = old_w; // 原高大于指定高 if (old_h > h) new_h = (int) Math.round(old_h / h2); else new_h = old_h; BufferedImage tag = new BufferedImage(new_w, new_h, 4); tag.getGraphics().drawImage(src.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0, 0, null); ImageIO.write(tag, format, fos); tag.flush(); } catch (IOException ex) { ex.printStackTrace(); } finally { if (fos != null) { fos.close(); } } } // ==========在服务端为用户保存图片上传信息================================================ // private static final ThreadLocal<> threadLocal =new ThreadLocal<>(); }


    package com.xyt.gsm.service.fs;
    
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    
    import com.xyt.gsm.bean.common.ResultBean;
    import com.xyt.gsm.entity.mgr.User;
    
    public interface FileUploadService
    {
    
    	String singleUpload(HttpServletRequest request, User user, String suffixDir, String type, Boolean cutPhoto) throws Exception;//
    
    	List<?> MonyUpload(HttpServletRequest request, User user, String suffixDir);//
    
    	int deleteFile(HttpServletRequest request, boolean cutPhoto, String... path);
    
    	ResultBean deleteFileAnDb(HttpServletRequest request, String type, String id, boolean cutPhoto, String... path) throws Exception;
    
    	String singleUpload(HttpServletRequest request, User user, String suffixDir, String type, Boolean cutPhoto, String merchantId) throws Exception;//
    
    	List<String> singleUpload(HttpServletRequest request, String suffixDir, String type, Boolean cutPhoto, String merchantId) throws Exception;//
    
    	void download();
    
    }
    

    package com.xyt.gsm.service.fs.imp;
    
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    import com.xyt.gsm.bean.common.ResultBean;
    import com.xyt.gsm.constant.CommonConstants;
    import com.xyt.gsm.constant.DictConstants;
    import com.xyt.gsm.constant.Fs;
    import com.xyt.gsm.constant.Fs.UpoladStatus;
    import com.xyt.gsm.entity.mgr.User;
    import com.xyt.gsm.service.fs.FileUploadService;
    import com.xyt.gsm.service.mgr.DictService;
    import com.xyt.gsm.service.mgr.ProductPhotoService;
    import com.xyt.gsm.utils.FileUpload;
    
    public class FileUploadServiceImp implements FileUploadService
    {
    	protected Log log = LogFactory.getLog(this.getClass().getName());
    
    	private ProductPhotoService productPhotoService;
    	private DictService dictService;
    
    	public void setProductPhotoService(ProductPhotoService productPhotoService)
    	{
    		this.productPhotoService = productPhotoService;
    	}
    
    	public void setDictService(DictService dictService)
    	{
    		this.dictService = dictService;
    	}
    
    	@Override
    	public String singleUpload(HttpServletRequest request, User user, String suffixDir, String type, Boolean cutPhoto, String merchantId) throws Exception
    	{
    
    		String path = "";
    		// 图片上传类型
    		if (type.equals(Fs.FileUpLoadType.PHOTO))
    		{
    
    			if (user == null)
    				return UpoladStatus.上传失败末知错误.toString();
    
    			if ("".equals(merchantId) || merchantId == null)
    			{
    				// 运营人员操作 为 还有一文件夹下
    				if (CommonConstants.RoleType.OPERATER.equals(user.getUserType()))
    				{
    					//merchantId = Fs.FileDir.OPERATION_DIR;
    					merchantId = "";
    				} else
    				{
    					//获取供应商id
    					merchantId = user.getMerchantId();
    				}
    			}
    
    			// 推断数据字典里是否有该文件夹
    			Map<String, String> photos = (Map<String, String>) dictService.getDictMap(DictConstants.ClsCode.FS);
    			if (!matchDir(photos, suffixDir))
    			{
    				// suffixDir=FileDir.NOT_DIR;
    				path=com.xyt.gsm.constant.Fs.UpoladStatus.文件文件夹未分配.name();
    
    			} else
    			{
    
    				// 商家id /处理
    				merchantId = manageSeparator(merchantId);
    				// suffixdri
    				suffixDir = manageSeparator(suffixDir);
    
    				path = FileUpload.fileUpload(request, merchantId + suffixDir, Fs.FileUpLoadType.PHOTO, cutPhoto).get(0);
    
    			}
    		}
    
    		return path;
    	}
    
    	@Override
    	public String singleUpload(HttpServletRequest request, User user, String suffixDir, String type, Boolean cutPhoto) throws Exception
    	{
    
    		return singleUpload(request, user, suffixDir, type, cutPhoto, "");
    	}
    
    	@Override
    	public List<?> MonyUpload(HttpServletRequest request, User user, String suffixDir)
    	{
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	@Override
    	public int deleteFile(HttpServletRequest request, boolean cutPhoto, String... path)
    	{
    
    		return 0;
    	}
    
    	@Override
    	public void download()
    	{
    		// TODO Auto-generated method stub
    
    	}
    
    	// 处理 / 前后有无/都能够
    	public String manageSeparator(String str)
    	{
    		if (str == null)
    			str = "";
    		if (!"".equals(str))
    		{// --05/01/
    			// 不须要/
    			if (str.startsWith("/"))
    				str = str.substring(1);
    			// 要加上/
    			if (!str.endsWith("/"))
    				str = str + "/";
    		}
    
    		return str;
    	}
    
    	// -------------------------------------------
    	// 匹配前端的文件夹和数据库的文件夹是否一至,以防前后有无/问题
    	// -------------------------------------------
    	public boolean matchDir(Map<String, String> photos, String webDir)
    	{
    		if (photos == null)
    			return false;
    		if (webDir == null)
    			webDir = "";
    
    		boolean isMatch = false;
    
    		if (photos.containsKey(webDir))
    			return true;
    		String temp = "";
    		// 不匹配的情况下!再进行前后/处理匹配
    		if (webDir.startsWith("/"))
    		{
    			// 前面 不要/
    			temp = webDir.substring(1);
    			if (photos.containsKey(temp))
    				return true;
    
    		}
    
    		if (webDir.endsWith("/"))
    		{
    			// 后面 不要/
    			temp = webDir.substring(0, webDir.length() - 1);
    			if (photos.containsKey(temp))
    				return true;
    		}
    
    		if (!webDir.endsWith("/"))
    		{
    			// 后面 要/
    			temp = webDir + "/";
    			if (photos.containsKey(temp))
    				return true;
    		}
    
    		if (!webDir.startsWith("/"))
    		{
    			// 前面 要/
    			temp = "/" + webDir;
    			if (photos.containsKey(temp))
    				return true;
    		}
    
    		// 前面 后面要/
    		if (!webDir.startsWith("/") && !webDir.endsWith("/"))
    		{
    			temp = "/" + webDir + "/";
    			if (photos.containsKey(temp))
    				return true;
    		}
    
    		// 前面 后面 不要/
    		if (webDir.startsWith("/") && webDir.endsWith("/"))
    		{
    			temp = webDir.substring(1, webDir.length() - 1);
    			if (photos.containsKey(temp))
    				return true;
    		}
    
    		return isMatch;
    	}
    
    	@Override
    	public ResultBean deleteFileAnDb(HttpServletRequest request, String type, String id, boolean cutPhoto, String... path) throws Exception
    	{
    
    		ResultBean rb = new ResultBean();
    
    		if (type.equals(Fs.FileUpLoadType.PHOTO))
    		{
    			// 删除数据
    			int count = productPhotoService.deleteByProductId(id);
    			if (count > 0)
    			{
    				// 删除图片
    				int cou = FileUpload.deleteFile(request, cutPhoto, path);
    				if (0 >= cou)
    				{
    					log.warn("id:" + id + ": 数据删除成功!图片删除失败");
    				}
    
    			} else
    			{
    				rb.setSuccess(false);
    			}
    		}
    		return rb;
    
    	}
    
    	@Override
    	public List<String> singleUpload(HttpServletRequest request,
    			String suffixDir, String type, Boolean cutPhoto, String merchantId)
    			throws Exception {
    
    		List<String> paths = null;
    		// 图片上传类型
    		if (type.equals(Fs.FileUpLoadType.PHOTO))
    		{
    
    			// 推断数据字典里是否有该文件夹
    			Map<String, String> photos = (Map<String, String>) dictService.getDictMap(DictConstants.ClsCode.FS);
    			if (!matchDir(photos, suffixDir))
    			{
    				// suffixDir=FileDir.NOT_DIR;
    				
    //				path=com.xyt.gsm.constant.Fs.UpoladStatus.文件文件夹未分配.name();
    
    			} else
    			{
    
    				// 商家id /处理
    				merchantId = manageSeparator(merchantId);
    				// suffixdri
    				suffixDir = manageSeparator(suffixDir);
    
    				paths = FileUpload.fileUpload(request, merchantId + suffixDir, Fs.FileUpLoadType.PHOTO, cutPhoto);
    
    			}
    		}
    
    		return paths;
    	}
    
    }
    

    package com.xyt.gsm.mvc.controller.fs;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.google.gson.JsonObject;
    import com.xyt.gsm.bean.common.ResultBean;
    import com.xyt.gsm.bean.mgr.FileUploadVo;
    import com.xyt.gsm.bean.mgr.LoginUser;
    import com.xyt.gsm.constant.CommonConstants;
    import com.xyt.gsm.constant.Fs;
    import com.xyt.gsm.constant.Fs.UpoladStatus;
    import com.xyt.gsm.entity.mgr.ProductPhoto;
    import com.xyt.gsm.entity.mgr.User;
    import com.xyt.gsm.mvc.controller.BaseController;
    import com.xyt.gsm.service.fs.FileUploadService;
    import com.xyt.gsm.service.ice.MerchantService;
    import com.xyt.gsm.utils.FileUpload;
    import com.xyt.gsm.utils.StringUtil;
    
    /**
     * 图片上传接口 controller
     * 
     * @author liangrui
     * 
     */
    
    @Controller
    @RequestMapping(CommonConstants.UriPrefix.PC + CommonConstants.Menu.SYS + "/photoupload")
    public class PhotoUploadController extends BaseController
    {
    
    	protected Log log = LogFactory.getLog(this.getClass().getName());
    
    	@Resource
    	FileUploadService fileUploadService;
    	@Resource
    	MerchantService merchantService;
    
    	// 多张上传
    	@ResponseBody
    	@RequestMapping(value = "/manyup")
    	public List<String> ManyUp(HttpServletRequest request, HttpServletResponse response, String suffixDir) throws IllegalStateException, IOException
    	{
    		List<String> fileInfo = null;
    
    		return fileInfo;
    	}
    
    	// -----------------------------------------------------------------------------------
    	// 单张图片上传,返回路径
    	//@currentDomain:解决跨域。传值为==》主域server下的子页面   在子页面 周转, 回调父页面的JS函数
    	// ----------------------------------------------------------------------------------
    	@RequestMapping(value = "/singleup", method = RequestMethod.POST)
    	public void SingleUp(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "suffixDir", required = true) String suffixDir,
    			@RequestParam(required = false, value = "cutPhoto") boolean cutPhoto, @RequestParam(required = false, value = "merchantId") String merchantId) throws Exception
    	{
    		StringBuffer basePath=new StringBuffer(request.getScheme());
    		basePath.append("://");
    		basePath.append(request.getServerName());
    		basePath.append(":");
    		basePath.append(request.getServerPort());
    		basePath.append(request.getContextPath());
    		basePath.append("/");
    		//basePath.append(FileUpload.getRealFilePath()/*.substring(0,FileUpload.getRealFilePath().length()-1)*/);
    		
    		User user = super.getLoginUser(request).getUser();
    		if (user != null)
    		{
    			
    			String filePath = fileUploadService.singleUpload(request, user, suffixDir, Fs.FileUpLoadType.PHOTO, cutPhoto, merchantId);
    
    			// 处理返回状态
    			UpoladStatus result = getStatus(filePath);
    			String PromptSize = "";
    			if (UpoladStatus.类型无效或图片过大.toString().equals(result.toString()))
    			{
    				// 2^10=1024
    				PromptSize = "(最大限制:" + (FileUpload.photoSize >> 20) + "MB)";
    			}
    
    			PrintWriter out = response.getWriter();
    			response.setHeader("Cache-Control", "none-cache");
    			String idnum = request.getParameter("idnum");
    			String reutrnDate = "{'id':'" + idnum + "','filePath':'" + basePath.append(filePath).toString() + "','dbFilePath':'" + filePath + "','status':{'code':'" + result.ordinal() + "','message':'" + result.name()
    					+ PromptSize + "'}}";
    			String currentDomain = request.getParameter("currentDomain");
    			//<script>parent.parent.callback(" + reutrnDate + ");</script>
    			String ret="<iframe id="ifr" src=""+currentDomain+"#"+reutrnDate+""></iframe>";
    			out.print(ret);
    		
    		}
    
    	}
    
    	@RequestMapping(value = "/saveImage", method = RequestMethod.POST)
    	public void saveImage(HttpServletRequest request, HttpServletResponse response, FileUploadVo vo) throws Exception
    	{
    		// 删除旧的没用的图片
    		if (!StringUtil.isEmpty(vo.getOldImagePath()) && vo.getOldImagePath().startsWith("/"))
    		{
    			FileUpload.deleteFile(request, vo.getCutPhoto(), vo.getOldImagePath());
    		}
    		User user = super.getLoginUser(request).getUser();
    		String filePath = fileUploadService.singleUpload(request, user, vo.getSuffixDir(), Fs.FileUpLoadType.PHOTO, vo.getCutPhoto(), vo.getMerchantId());
    		JsonObject json = new JsonObject();
    		json.addProperty("filePath", filePath);
    		json.addProperty("success", false);
    		if (!StringUtil.isEmpty(filePath) && filePath.startsWith("/"))
    		{
    			json.addProperty("success", true);
    		}
    		String result="<iframe id="ifr01001" src='"+vo.getCallbackPath()+"#"+json.toString()+"'></iframe>";
    		responseText(response, result);
    
    	}
    
    	/**
    	 * 响应请求
    	 * 
    	 * @param response
    	 * @param result
    	 * @throws IOException
    	 */
    	private void responseText(HttpServletResponse response, String result) throws IOException
    	{
    		response.setHeader("pragma", "no-cache");
    		response.setHeader("cache-control", "no-no-cache");
    		response.setHeader("expires", "0");
    		response.setContentType("text/html;charset=UTF-8");
    		response.setCharacterEncoding("UTF-8");
    		PrintWriter out = null;
    		try
    		{
    			out = response.getWriter();
    			out.print(result);
    			out.flush();
    		} finally
    		{
    			if (out != null)
    			{
    				out.close();
    			}
    		}
    	}
    
    	// -----------------------------------------------------------------------------------
    	// 商品 图片数据和存储图片 删除 依据id
    	// ----------------------------------------------------------------------------------
    	@ResponseBody
    	@RequestMapping(value = "/delimgandb")
    	public ResultBean delImgAnDB(HttpServletRequest request, HttpServletResponse response, ProductPhoto photo, @RequestParam(required = true, value = "id") String id,
    			@RequestParam(value = "cutPhoto", required = false) boolean cutPhoto, @RequestParam(value = "path") String path) throws Exception
    	{
    		return fileUploadService.deleteFileAnDb(request, Fs.FileUpLoadType.PHOTO, id, cutPhoto, path);
    
    	}
    
    	// -----------------------------------------------------------------------------------
    	// 仅仅 删除存储图片
    	// ----------------------------------------------------------------------------------
    	// @ResponseBody
    	@RequestMapping(value = "/delimg")
    	public void delImg(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "path", required = true) String[] path,
    			@RequestParam(value = "cutPhoto", required = false) boolean cutPhoto) throws Exception
    	{
    
    		if (path.length > 0)
    		{
    			FileUpload.deleteFile(request, cutPhoto, path);
    		}
    
    	}
    
    	// 获得图片返回状态
    	public UpoladStatus getStatus(String filePath)
    	{
    		UpoladStatus result = UpoladStatus.上传失败末知错误;
    		boolean isUp = true;
    		for (UpoladStatus u : UpoladStatus.values())
    		{
    			if (filePath.equals(u.toString()))
    			{
    				result = u;
    				isUp = false;
    				break;
    			}
    		}
    		if (isUp)
    		{
    			result = UpoladStatus.SEUCCESS;
    		}
    		return result;
    	}
    
    	// -----------------------------------------------------------------------------------
    	// 获取上传server的域名
    	// 依据用户类型获取,
    	// 假设是商家。code 为null 默认取商家商品域名, 传參数 "1" 取商家域名
    	// ----------------------------------------------------------------------------------
    	@RequestMapping(value = "/getdomain", method = RequestMethod.POST)
    	@ResponseBody
    	public String getUpPhotoDomain(HttpServletRequest request, HttpServletResponse response, String code)
    	{
    
    		String domain = "";
    		LoginUser user = super.getLoginUser(request);
    		if (user != null)
    		{
    			// 运营
    			if (CommonConstants.RoleType.OPERATER.equals(user.getUser().getUserType()))
    			{
    				domain = user.getPublicUploadDomain();
    			} else if (CommonConstants.RoleType.MERCHANT.equals(user.getUser().getUserType()))
    			{
    				if (null == code || "".equals(code))
    				{
    					domain = user.getMerchantProductDomain();
    					// 假设没有取到
    					if (null == domain || "".equals(domain))
    					{
    						{
    							// 获取域名
    							domain = merchantService.getMerchantDomain(user.getUser().getMerchantId()).getProductDomain();
    						}
    					} else if ("1".equals(code))
    					{
    						domain = user.getMerchantDomain();
    						// 假设没有取到
    						if (null == domain || "".equals(domain))
    						{
    							{
    								// 获取域名
    								domain = merchantService.getMerchantDomain(user.getUser().getMerchantId()).getProductDomain();
    							}
    						}
    					}
    				}
    			}
    		}
    
    	     //协议://域名/项目/X目录  ====(去掉目录) 
    		 Matcher slashMatcher = Pattern.compile("/").matcher(domain);
    		    int mIdx = 0;
    		    while(slashMatcher.find()) 
    		    {
    		       mIdx++; if(mIdx == 4)break;
    		    }
    		 domain=domain.substring(0,slashMatcher.start());
    		/*if ("/fs".equals(domain.substring(domain.lastIndexOf("/"))))
    			{
    				domain = domain.substring(0, domain.lastIndexOf("/"));
    			}*/
    
    	return domain;
    	}
    	// -----------------------------------------------------------------------------------
    	// 下载
    	// ----------------------------------------------------------------------------------
    
    }
    

    前端
    部分相关代码
    商品主图:  
      <div class="upload" id="mainPicButton">
     <form method="post" enctype="multipart/form-data" target="hidden_frame" id="formImg0">
    									<!-- <input type="file" name="file0" id="file0" onchange="submitUpload('0')" style="68px;height:22px;"> -->
    									<input type="file" name="file0" id="file0" onchange="addOnePic('#mainPicButton')" style="68px;height:22px;">
    									<input type="hidden" name="idnum" value="0">
    									<input type="hidden" name="suffixDir" value="05/01"/>
    									<input type="hidden" name="cutPhoto" value="true">
    									<iframe name='hidden_frame' id="hidden_frame" style='display:none'></iframe>
    								</form>
    		                    </div>

    <th><span>商品很多其它图片:</span></th>
                 
    						<td>
    						           
    							<div  id="morePicButton">
    								<form method="post" enctype="multipart/form-data" target="hidden_frame" id="formImg1">
    									<input type="file" name="file0" id="file0" onchange="addMorePic();" style="68px;height:22px;">
    									<input type="hidden" name="idnum" value="0">
    									<input type="hidden" name="suffixDir" value="05/01"/>
    									<input type="hidden" name="cutPhoto" value="true">
    									<iframe name='hidden_frame' id="hidden_frame" style='display:none'></iframe>
    								</form>
    		                    </div>

    js:
    //全局常量
    var maxNoOfPics = 5;
    var picPrefix = "/fs"; //图片路径前缀
    
    //全局变量
    var imgNum = 0;      //图片数量
    var imgNo=0;		//图片ID
    var hasMainPic = false;
    var origPics = new Array(); //当更新某商品时。保存原来图片的路径,用于在删除时推断是否须要延迟删除
    
    //var domainStr=window.top.getLoginUser().merchantProductDomain;
    
    function getDomain(){
    	var domainSt="";
    	var userObj=window.top.getLoginUser();
    	if(userObj.user.userType=="0")
    	{
    		domainSt=userObj.publicUploadDomain;
    	}else if(userObj.user.userType=="2"){
    		domainSt=userObj.merchantProductDomain;
    	}
    //	alert (domainSt);
    	return domainSt;
    }
    
    function submitUpload(id){
    	$("#imgSrc" + id +"").attr("alt", "图片上传中……");
    	var imgID = id;
    	if(id>0){
    		imgID = 1;
    	}
    	
    	var form=document.getElementById("formImg" + imgID +"");	
    	form.method = "post";		
    	form.idnum.value = id;
    	
    	var uriUp= getDomain()+"/pc/sys/photoupload/singleup?

    "+window.top.getLoginUser().token; form.action = uriUp; //form.action = getContextPath()+"/pc/sys/photoupload/singleup"; //必须先包括sys.js文件 //用于返回 var currentHref=window.location.href; var subHref=currentHref.substring(0, currentHref.lastIndexOf("/")); var input_domain = document.createElement("input"); input_domain.setAttribute("name", "currentDomain"); input_domain.setAttribute("value", subHref+"/callback-up.html"); input_domain.setAttribute("type", "hidden"); form.appendChild(input_domain); form.submit(); //假设已经存在的图不是原图,则把server中的图片删除 var currentPicPath = $("#imgUrl" + id +"").val(); if(!contains(origPics, currentPicPath) && currentPicPath!=""){ delImg(currentPicPath, true);//true 删除图片 } }; // step2: 上传图片。后台回调 function callback(message) { var id=message.id; if(message.status.code=="0"){ var filePath=message.filePath; var dbFilePath=message.dbFilePath; //$("#imgUrl" + id +"").attr("value", dbFilePath); $("#imgUrl" + id +"").val(dbFilePath); $("#imgSrc" + id +"").attr("src", filePath); }else{ if(id!=0){ $("#imgSrc" + id).parent().remove(); } _message(message.status.message); //上传错误提示 } }; function deleteOrigPics(photoList){ //推断是否须要删除原图,假设原图不在photoList中,则删除 for(var i=1; i<origPics.length; i++){ var found=false; var j=0; while(!found && j<photoList.length){ if(photoList[j].url==origPics[i]){ found=true; } j++; } if(!found){ delImg(origPics[i], true); } } } /** * Author: 许继俊, 2014-04 * 为“很多其它图片”添加一个图片。加在morePicButtonId前面 * morePicButtonId: “加入图片”button的ID。调用此方法就在它前面加入一个图片 * imgNo:图片序号 * picPrefix: 图片路径前缀 * filePath:图片(相对)路径 */ //dbFilePath 用于存放数据库, fullFilePath用于显示图片 function addOnePic(picButtonId, dbFilePath, fullFilePath){ if(picButtonId == "#mainPicButton"){ //假设是主图 imgId = 0; }else{ //假设是“很多其它图片” imgNo++; imgNum++; imgId = imgNo; } if(picButtonId == "#mainPicButton" ){ if(hasMainPic == false){ var html = '<span class="pict"> <img id="imgSrc' + imgId + '" width="120px" height="120px"/> <a class="close" onclick="removeImg('' + imgId + '')"></a> <input type="hidden" id="imgUrl' + imgId + '"/></span>'; $(picButtonId).after(html); hasMainPic = true; } }else{ var html = '<span class="pict"> <img id="imgSrc' + imgId + '" width="120px" height="120px"/> <a class="close" onclick="removeImg('' + imgId + '')"></a> <input type="hidden" class="imgUrl" id="imgUrl' + imgId + '"/></span>'; $(picButtonId).after(html); } if(fullFilePath != undefined){ $("#imgUrl" + imgId +"").val(dbFilePath); $("#imgSrc" + imgId +"").attr("src", fullFilePath); }else{ submitUpload(imgId); //假设仅仅有一个參数。则是提交 } } //加入很多其它图片: function addMorePic(){ if(imgNum>=maxNoOfPics){ _message("对不起。最多仅仅能上传" + maxNoOfPics + "张图片!

    "); return false; } addOnePic("#morePicButton"); } //删除图片(imgNo=0时为主图) function removeImg(imgNo){ var picPath=""; if($("#imgUrl"+ imgNo).val()!=undefined){ picPath=$("#imgUrl"+ imgNo).val(); $("#imgSrc" + imgNo).parent().remove(); } if(imgNo==0){ //删除主图 hasMainPic = false; //$("#imgSrc0").removeAttr("src"); //$("#imgSrc0").attr("alt","点击加入图片"); //$("#imgUrl0").removeAttr("value"); }else{ //删除其它图 imgNum--; } //假设是原图。则延迟server的删除(在提交时再删除) if(picPath != origPics[imgNo]){ delImg(picPath,true);//true 删除小图 } } //删除图片 function delImg(path, cutPhoto){ var reqStr=null; if(cutPhoto==true){ reqStr="path="+path+"&cutPhoto=true"; }else{ reqStr="path="+path+"&cutPhoto=false"; } $.post( getContextPath()+"/pc/sys/photoupload/delimg", reqStr, function(data){ }, 'json' ); } /**推断在数组中是否含有给定的一个变量值/对象 * array: 数组 * obj: 值/对象 */ function contains(array, obj) { for (var i = 0; i < array.length; i++) { if (array[i] === obj) { return true; } } return false; }


    callback-up.html
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
    </head>
    <body>
    <script type="text/javascript">
    
    //alert(document.domain);
    var returndata=self.location.hash.substring(1);
    if(parent.parent&&parent.parent.callback){
    	var message = eval('(' + returndata + ')'); 
    	parent.parent.callback(message);
    }else if(window.top.success){
    	window.top.success(returndata);
    }else if(parent.parent&&parent.parent.success){
    	parent.parent.success(returndata);
    }
    	
    
    </script>
    </body>
    </html>
    



  • 相关阅读:
    网络编程学习笔记:Socket编程
    C# url 路径转换 相对路径 转换为 绝对路径
    利用pycharm运行scrapy以及scrapy的配置
    基于scrapy的分布式爬虫抓取新浪微博个人信息和微博内容存入MySQL
    LeetCode 1. Two Sum
    【转载】C#异常Retry通用类
    【转载】WebDriver(C#)之十点使用心得
    c#值类型和引用类型
    percona5.7 源码安装
    android UI进阶之用ViewPager实现欢迎引导页面[转]
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7347509.html
Copyright © 2020-2023  润新知