public String storePhoto(String set, String md5, byte[] content, int coff, int clen)
	{
		long length = clen;			//用于构造返回值
		String location;
		
		//根据set和md5构造存储的路径
		StringBuffer sb = new StringBuffer();
		sb.append(destRoot);
		sb.append(set);
		sb.append("/");
		String path = sb.toString();		//存储文件的文件夹的相对路径，不包含文件名

		//找到当前可写的文件块,如果当前不够大,或不存在,则新创建一个,命名block＿id,id递增,redis中只存储id
		//用curBlock缓存当前可写的块，减少查询jedis的次数
		
		File dir;			//要写的块所在文件夹
		StringBuffer rVal = new StringBuffer();
		try 
		{
			if (curBlock < 0) 
			{
				String reply = jedis1.get(set + "." + localHostName);
				if (reply != null) {
					curBlock = Long.parseLong(reply);		//需要通过节点名字来标示不同节点上相同名字的集合
					newf = new File(path + "b" + curBlock);
				} 
				else 
				{
					curBlock = 1;
					dir = new File(path);
					if(!dir.exists())
						dir.mkdirs();
					newf = new File(path + "b" + curBlock);
					jedis1.sadd(set+".l", localHostName+"#"+serverport);			//把集合和它所在节点记录在redis的set里,方便删除,set.l表示set所在的位置
					jedis1.set(set + "." + localHostName, "" + curBlock);
				}
				raf = new RandomAccessFile(newf, "rw");
				offset = newf.length();
				raf.seek(offset);
			} 
			else 
			{
				if (newf.length() + content.length > blocksize) 
				{
					curBlock++;
					newf = new File(path + "b" + curBlock);
					// jedis1.set(set, curBlock);
					if(raf != null)			//如果换了一个新块,则先把之前的关掉
						raf.close();
					raf = new RandomAccessFile(newf, "rw");
					jedis1.incr(set + "." + localHostName);			//当前可写的块号加一
					offset = 0;
				}
			}
			// 文件块的路径名，包括文件名,不包括destRoot指定的第一级目录,解析时需要加上
			location = path.substring(destRoot.length()) + newf.getName();

			raf.write(content,coff,clen);
			// raf.close();
			// 构造返回值
			rVal.append("1#"); // type
			rVal.append(set);
			rVal.append("#");
			rVal.append(localHostName); // node
			rVal.append("#");
			rVal.append(serverport); // port
			rVal.append("#");
			rVal.append(location);
			rVal.append("#");
			rVal.append(offset);
			rVal.append("#");
			rVal.append(length);

			offset += length;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		String returnVal = rVal.toString();
		// 确保多个进程生成的字符串只有一个被记录下来并且被完整的记录下
		Pipeline pipeline = jedis.pipelined();
//		pipeline.incr(set+".r." + md5);
//		pipeline.setnx(set+"."+md5, returnVal);
		pipeline.hincrBy(set, "r."+md5, 1);
		pipeline.hsetnx(set, md5, returnVal);
		List<Object> l = pipeline.syncAndReturnAll();
//		System.out.println(l.get(1).getClass());
		if((Long)l.get(1) == 1)
			return returnVal;
		else
			return "#";
		

	}