`
uule
  • 浏览: 6387313 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传

 
阅读更多

现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc上略有不同,移动端你不能去限制图片大小,让用户先处理图片再上传,这样不现实。所以理解的解决方案就是在上传先进行图片压缩,然后再把压缩后的图片上传到服务器

localResizeIMG,它会对图片进行压缩成你指定宽度及质量度并转换成base64图片格式,那么我们就可以把这个base64通过ajax传到后台,再进行保存,先压缩后上传的目的就达到了。

 

处理过程:

LocalResizeIMG压缩图片

Ajax Post图片base64到后台

后台接收base64并保存,返回状态

 

包含:

LocalResizeIMG.js(插件主体,压缩图片)

mobileBUGFix.mini.js(移动端的补丁,包括MegaPixImage.js)

exif.js

 

在线任意图片转Base64编码工具 - aTool在线工具

 

LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android

源码:https://github.com/think2011/localResizeIMG

 

使用lrz压缩上传图片,后台使用java

移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传

HTML5+Canvas+jQuery调用手机拍照功能实现图片上传(一)

 

exif.js(lrz.js控件中使用了):

Exif.js 提供了 JavaScript 读取图像的原始数据的功能扩展,例如:拍照方向、相机设备型号、拍摄时间、ISO 感光度、GPS 地理位置等数据。

Exif.js 读取图像的元数据

利用exif.js解决ios手机上传竖拍照片旋转90度问题

 

(java)利用BASE64编码和解码图片文件

 

代码:

效果:

 

 

HTML:

<!-- 上传图片时显示“正在上传..请等待”,上传后显示各图片-->
<li class="pic-list"></li>	

<li class="upload">
	<input type="file" accept="image/*" id="cameraInput" name="cameraInput">
	上传图片
</li>

<!-- 引用-->:
<script type="text/javascript" src="${staticServerUrl}/js/lrz/mobileFix.mini.js?v=20150704"></script>
<script type="text/javascript" src="${staticServerUrl}/js/lrz/exif.js?v=20150704"></script>
<script type="text/javascript" src="${staticServerUrl}/js/lrz/lrz.js?v=20150704"></script>

 

JS:

var input = document.querySelector('#cameraInput');
var types = [".jpg",".jpeg",".gif",".png"];
var mpiArr = [];
var index = 0;


input.onchange = function () {
	
	var file = this.files[0];
	var span = document.createElement('span');
	var fileName = file.name;
	var imgSize = file.size;
	if(!checkFileType(fileName)) {
		alert("文件类型必须为jpg/jpeg/gif/png");
		return;
	}
    if(imgSize > 3*1024*1024) { //大于2M
    	alert("请上传小于3M的文件");
		return;
    }
	document.querySelector('.pic-list').appendChild(span);
	span.innerHTML = '<p>正在上传..请等待</p>';
	
    lrz(file, {
        before: function() {
        },
        fail: function(err) {
            //console.error(err);
        },
        always: function() {
        },
        done: function (results) {
        
        setTimeout(function () {
            $.post(
            	"/ajax/uploadImg.do",
            	{
                    imgBase64: results.base64,
                    imgSize: results.base64.length, // 校验用,防止未完整接收
                    imgName : fileName
                },
                function (data) {
                        var rData = eval('(' + data + ')');                        
                        
                        var img = document.createElement('img');
                        
                        var timestamp=new Date().getTime();
                    	var idx = "img" + fileName.substring(0, fileName.indexOf(".")) + timestamp;
                    	$(span).attr("class" ,"imgSpan");
                    	$(span).attr("id" ,idx);
                    	$(span).attr("name" ,rData.path);
                    	
                        if(!rData.ret || rData.content != "ok") {
                        	span.innerHTML = '<p>上传失败</p>';
                        } else {
                        	span.innerHTML = '<p>上传成功</p>';
							//用于上传完成后直接展示图片
                        	var mpImg = new MegaPixImage(file);                        	
                        	mpImg.render(img, { maxWidth: 150, maxHeight: 150, quality: 0.5 }); 
							mpiArr.push({"id":idx,"mpi":mpImg});
                        	span.innerHTML = "";
                        	span.appendChild(img);
                        }
                    }
            );
        }, 100);
        }
    });
};

 

//用于点击上传展示的图片时,往指定位置(ueditor编辑器里)插入该图片
$(document).on("click",".imgSpan",function(){
	var id = $(this).attr("id");
	var imgSrc = $(this).attr("name");
	var mpi;
	$.each(mpiArr, function(index,value){
		if(value.id == id) {
			mpi = value.mpi;
		}
	});
	var idx = id + index++;
	//ueditor的对象um
	um.focus();
	um.execCommand('inserthtml',"<img id='" + idx + "' src='" + imgSrc + "' _src='" + imgSrc + "' ></img>");
	mpi.render($(window.frames["1"].document).find("#"+idx).get(0), { maxWidth: 150, maxHeight: 150, quality: 0.5, _src: imgSrc }); 
});

 

String.prototype.endWith=function(str){
  if(str==null||str==""||this.length==0||str.length>this.length)
     return false;
  if(this.substring(this.length-str.length)==str)
     return true;
  else
     return false;
  return true;
 }

function checkFileType(name) {
	var flag = false;
	$.each(types,function(index,value) {
		if(name.endWith(value)) {
			flag = true;
		}
	})
	return flag;
}

 后台:

入口:

/**
	 * 上传图片
	 */
	public String uploadImg() {
		if(!checkFileType(getFileExt(imgName))) {
			CDO result = new CDO();
			result.setBooleanValue("ret", false);
			result.setStringValue("content", "文件应为jpg,jpeg,gif,png");
			ajaxForAction(response, result.toJSON());
			return null;
		}
		String imgFilePath = saveBase64toLocal(getFileName(imgName));
		String returnStr = uploadtoImgServer(imgFilePath);
		ajaxForAction(response, returnStr);

		return null;
	}

/**
	 * 文件类型判断
	 */
	private boolean checkFileType(String fileName) {
		String imgAllowTypes = ProPertiesUtil.getValue("/topic.properties", "img_allow_types");
		String[] allowFiles = imgAllowTypes.split(";");
		Iterator<String> type = Arrays.asList(allowFiles).iterator();
		while (type.hasNext()) {
			String ext = type.next();
			if (fileName.toLowerCase().endsWith(ext)) {
				return true;
			}
		}
		return false;
	}
	
/**
	 * 获取文件扩展名
	 */
	private String getFileExt(String fileName) {
		return fileName.substring(fileName.lastIndexOf("."));
	}

	/**
	 * 依据原始文件名生成新文件名
	 */
	private String getFileName(String fileName) {
		String radomStr = new SimpleDateFormat("yyyyMMddHHmmsss").format(new Date());
		return fileName.substring(0,fileName.lastIndexOf(".")) + radomStr + this.getFileExt(fileName);
	}
	/**
	 * 保存图片到临时文件目录
	 
	 *	#本地临时图片存储地址
	 *	tmp_img_path=/upload
	 *	#允许上传的图片类型
	 *	img_allow_types=.jpg;.jpeg;.gif;.png
	 */
	private String saveBase64toLocal(String fileName) {
		String imgFilePath = "";
		
		Long userId = getLoginID();
		logger.info("添加图片,用户id:"+userId+",版块id:"+boardID+",图片名:"+imgName);
		int index = imgBase64.indexOf(";base64,");
		String base64Str = imgBase64.substring(index + ";base64,".length());
		
		String tmpImgPath = ProPertiesUtil.getValue("/abc.properties", "tmp_img_path");
		imgFilePath = getPhysicalPath(tmpImgPath) + File.separator + fileName;// 新生成的图片

		BASE64Decoder decoder = new BASE64Decoder();
		OutputStream out = null;
		try {
			// Base64解码
			byte[] b = decoder.decodeBuffer(base64Str);
			for (int i = 0; i < b.length; ++i) {
				if (b[i] < 0) {// 调整异常数据
					b[i] += 256;
				}
			}
			// 生成jpeg图片
			out = new FileOutputStream(imgFilePath);
			out.write(b);
			out.flush();
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		} finally {
			try{
				out.close();
			}catch (Exception e) {
				logger.error(e.getMessage(), e);
			}
		}
		logger.info("成功添加图片,用户id:"+userId+",版块id:"+boardID+",图片位置:"+ imgFilePath);
		
		return imgFilePath;

	}

	/**
	 * 根据传入的虚拟路径获取物理路径
	 */
	private String getPhysicalPath(String savePath) {
		return ServletActionContext.getServletContext().getRealPath(savePath);
	}
	
	/**
	 * 上传图片到服务器
	 * httpclient-4.0.1.jar	
	 * httpmime-4.0.1.jar
         * img_server_path=http://...com/BBSPicServlet
	 */
	private String uploadtoImgServer(String filePath) {
		String returnStr = "";

		Long userId = getLoginID();
		logger.info("上传图片服务器,用户id:"+userId+",版块id:"+boardID+",图片路径:"+filePath);
		
		String IMAGE_FTP_PATH = ProPertiesUtil.getValue("/server.properties", "img_server_path");
		HttpClient httpclient = new DefaultHttpClient();
		HttpPost post = new HttpPost(IMAGE_FTP_PATH);
		File file = new File(filePath);
		FileBody fileBody = new FileBody(file);
		try {

			MultipartEntity entity = new MultipartEntity();
			entity.addPart("file", fileBody);
			post.setEntity(entity);
			HttpResponse response = httpclient.execute(post);
			logger.info("图片服务器返回code:" + response.getStatusLine().getStatusCode());
			if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {

				HttpEntity entitys = response.getEntity();
				if (entitys != null) {
					//resultLen = entity.getContentLength();
					returnStr = EntityUtils.toString(entitys);
				}
			}
			httpclient.getConnectionManager().shutdown();
			
			//删除本地
			file.delete();
		} catch (UnsupportedEncodingException e) {
			logger.error(e.getMessage(), e);
		} catch (ClientProtocolException e) {
			logger.error(e.getMessage(), e);
		} catch (IOException e) {
			logger.error(e.getMessage(), e);
		}
		logger.info("成功上传图片服务器,用户id:"+userId+",版块id:"+boardID+",服务器返回:"+returnStr );
		
		return returnStr;
	}

 

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.log4j.Logger;


/**
 * bbs 图片上传
 * 
 * @author Administrator
 * 
 */
public class BBSPicServlet extends HttpServlet {
	private static String savePath = ProPertiesUtil.getValue(
			"/path.properties", "bbsimgpath");
	private Logger logger = Logger.getLogger(PICServlet.class);

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
	}

	private boolean isEmpty(String str) {
		if (str == null || "".equals(str.trim()))
			return true;
		return false;
	}

	private boolean checkInt(String str) {
		String reg = "^[0-9]+$";
		Pattern pattern = Pattern.compile(reg);
		Matcher matcher = pattern.matcher(str);
		return matcher.matches();

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		String filenames = "";
		String res = "";
		String datap = "";
		// 如果有尺寸,检查尺寸
		logger.info("==get==================");
		String picWidth = request.getParameter("picWidth");
		String picHeigth = request.getParameter("picHeigth");
		if (!isEmpty(picWidth) || !isEmpty(picHeigth)) {
			if (!checkInt(picWidth) || !checkInt(picHeigth)) {
				response.setContentType("text/html;charset=UTF-8");
				PrintWriter out = response.getWriter();
				out.println("{'ret':'false','content':'尺寸错误'}");
				out.close();
				return;
			}

		}

		DiskFileItemFactory fac = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(fac);
		upload.setHeaderEncoding("UTF-8");
		upload.setFileSizeMax(2 * 1024 * 1024);
		List fileList = null;
		try {
			fileList = upload.parseRequest(request);
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			logger.error(e.getMessage(), e);
			response.setContentType("text/html;charset=UTF-8");
			PrintWriter out = response.getWriter();
			out.println("{'ret':'false','content':'图片过大,不能大于500K'}");
			out.close();
			return;
		}
		String name = "";
		String extName = "";
		long size = 0;
		String fileName = "";
		Iterator<FileItem> it = fileList.iterator();
		while (it.hasNext()) {
			FileItem item = it.next();
			if (!item.isFormField()) {
				name = item.getName();
				if (name == null || name.trim().equals("")) {
					continue;
				}
				size = item.getSize();
				if ("".equals(name) || size == 0) {
					break;
				}
				String t_name = name.substring(name.lastIndexOf("\\") + 1);
				logger.info("=================" + t_name);
				String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);
				String[] allowedExt = { "jpg", "jpeg", "gif", "png" };
				int allowFlag = 0;
				int allowedExtCount = allowedExt.length;
				for (; allowFlag < allowedExtCount; allowFlag++) {
					if (allowedExt[allowFlag].equals(t_ext.toLowerCase()))
						break;
				}
				if (allowFlag == allowedExtCount) {
					res = "文件应为: jpg,jpeg,gif,png";
					response.setContentType("text/html;charset=UTF-8");
					PrintWriter out = response.getWriter();
					out.println("{'ret':'false','content':'文件应为jpg,jpeg,gif,png'}");
					out.close();
					return;
				} else {
					if (name.lastIndexOf(".") >= 0) {
						extName = name.substring(name.lastIndexOf("."));
					}

					String all = DateUtils.simpleDateFormat(
							"yyyy-MM-dd HH:mm:ss", new Date());
					String hour = all.split(" ")[1].split(":")[0];
					String aa[] = all.split(" ")[0].split("-");
					// savePath = savePath+"/"+aa[0]+"/"+aa[1]+"/"+aa[2];
					datap = "/" + aa[0] + "/" + aa[1] + "/" + aa[2] + "/"+ hour;
					String newDir = savePath + datap;
					File file = new File(newDir);
					if (!file.exists()) {
						file.mkdirs();
					}

					fileName = UUID.randomUUID().toString().replaceAll("-", "");

					File saveFile = new File(newDir + "/" + fileName + extName);
					filenames = fileName + extName;
					String bucket = ProPertiesUtil.getValue(
							"/accesskey.properties", "bbsbucket");
					Boolean tokingok = false;
					try {
						item.write(saveFile);
						// 如果有尺寸,检查尺寸
						if (!isEmpty(picWidth) || !isEmpty(picHeigth)) {
							java.awt.image.BufferedImage bi = javax.imageio.ImageIO
									.read(saveFile);

							if (bi.getWidth() != Integer.parseInt(picWidth)
									|| bi.getHeight() != Integer
											.parseInt(picHeigth)) {
								saveFile.delete();
								response.setContentType("text/html;charset=UTF-8");
								PrintWriter out = response.getWriter();
								out.println("{'ret':'false','content':'文件尺寸不对'}");
								out.close();
								return;
							}

							// 发送到云
							tokingok = KingCloudUtil.uploadObjectByFile(bucket,
									"img" + datap + "/" + filenames, saveFile);
							// 本地删除

						} else {
							// 发传送到云
							tokingok = KingCloudUtil.uploadObjectByFile(bucket,
									"img" + datap + "/" + filenames, saveFile);
						}
						saveFile.delete();

						logger.info("====ok====="+ filenames);
						
						if (tokingok == true) {
							response.setContentType("text/html;charset=UTF-8");
							PrintWriter out = response.getWriter();
							String str = "{'ret':'true','content':'ok','path':'"
									+ ProPertiesUtil.getValue(
											"/accesskey.properties",
											"bbsimgurl")
									+ "/img"
									+ datap
									+ "/"
									+ filenames + "'}";
							out.println(str);
							out.close();
						} else {
							response.setContentType("text/html;charset=UTF-8");
							PrintWriter out = response.getWriter();
							String str = "{'ret':'false','content':'云出错'}";
							out.println(str);
							out.close();
						}

					} catch (Exception e) {
						res = "false";
						logger.error(e.getMessage(), e);
						response.setContentType("text/html;charset=UTF-8");
						PrintWriter out = response.getWriter();
						out.println("{'ret':'false','content':'写入错误'}");
						out.close();
					}

				}

			}
		}

	}

	public static void main(String[] args) {
		System.out.println(UUID.randomUUID().toString().replaceAll("-", ""));
		System.out.println(DateUtils.simpleDateFormat("yyyyMMdd", new Date()));
		String aa = "E:/Seller20110928/upload/";
		File file = new File(aa);
		if (!file.exists()) {
			file.mkdirs();
		}
	}
}

 

读取时:

读取时,也得把编辑框里的内容转换为BASE64Code,convertImgBASE64Code,这样才可正常读取

若不转换,编辑框里显示的是纯文本,图片显示的是路径,不会展示

String contentWithBase64Img = HtmlUtil.convertImgBASE64Code(cdoTopic.getStringValue("content"));
cdoTopic.setStringValue("content",URLEncoder.encode(contentWithBase64Img,"UTF-8"));

 

JS:

<input type="hidden" id="srcContent" name="srcContent" value="${cdoTopic.getStringValue('content')}" />

$(document).ready(function(){
	var srcContent = $("#srcContent").val();
	um.addListener("ready", function () {
		um.execCommand('inserthtml', decodeURIComponent(srcContent.replace(/\+/g, '%20')));
		var imgArr = $(window.frames["1"].document).find("img");
		for(var i = 0 ; i < imgArr.length; i++){
			var imgSrc = $(imgArr[i]).attr("src");
			var mpImg = new MegaPixImage(imgArr[i]);
			mpImg.render(imgArr[i], { maxWidth: 150, maxHeight: 150, quality: 0.5, _src: imgSrc });
		}
	});
});

 工具类:

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Encoder;

public class HtmlUtil {
    private static Logger logger = LoggerFactory.getLogger(HtmlUtil.class);

    public static String convertImgLazyLoad(String bodyFragment){
        Document doc = Jsoup.parseBodyFragment(bodyFragment);
        Elements imgs = doc.getElementsByTag("img");
        for(int i=0; i< imgs.size(); i++){
            Element img = imgs.get(i);
            img.addClass("lazy");
            img.attr("data-original", img.attr("src"));
            img.attr("src", ProPertiesUtil.getValue("/server.properties", "staticServer") + "/img/loading.gif");
        }
        return doc.body().html();
    }

    public static String convertImgBASE64Code(String bodyFragment){
        Document doc = Jsoup.parseBodyFragment(bodyFragment);
        Elements imgs = doc.getElementsByTag("img");
        for(int i=0; i< imgs.size(); i++){
            Element img = imgs.get(i);
            String src =  img.attr("src");
            String base64Str = "";
            try{
                base64Str = getImageBASE64Code(src);
            }catch (IOException e){
                logger.error(e.getMessage(), e);
            }
            img.attr("_src", img.attr("src"));
            img.attr("src", base64Str);
        }
        return doc.body().html();
    }

    /**
     * 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
     *
     * @param imgUrl
     * @return
     * @throws IOException
     */
    private static String getImageBASE64Code(String imgUrl) throws IOException {
        URL url = new URL(imgUrl);
        HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection();
        if (conn.getResponseCode() == 200) {
            java.io.InputStream is = conn.getInputStream();
            java.io.ByteArrayOutputStream baos =
                    new java.io.ByteArrayOutputStream();

            int buffer = 1024;
            byte[] b = new byte[buffer];
            int n = 0;
            while ((n = is.read(b, 0, buffer)) > 0) {
                baos.write(b, 0, n);
            }
//            String s = new String(baos.toByteArray(), "UTF-8");
            is.close();
            baos.close();
            // 对字节数组Base64编码
            BASE64Encoder encoder = new BASE64Encoder();
            return "data:image/jpeg;base64," + encoder.encode(baos.toByteArray());
//            return encoder.encode(baos.toByteArray());
        }
        return "";
    }

    public static void main(String[] args){
        String content = "<img src=\"http://img.com/bbs/2015/07/03/14/0ccb5349b8d246f28f64dbf9acd2161f.jpg\" alt=\"\" />gdsahdshsdhdsh<span>asdads";
//        String content = "//img.com/bbs/2015/07/03/14/0ccb5349b8d246f28f64dbf9acd2161f.jpg\" alt=\"\" />gdsahdshsdhdsh<span>asdads";
        System.out.println(convertImgLazyLoad(content));

    }
}

 

。。。

 

 

 

  • lrz.zip (29.8 KB)
  • 描述: JS包
  • 下载次数: 39
  • 大小: 70.1 KB
分享到:
评论

相关推荐

    localResizeIMG.js:移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传,(H5)FormData+AJAX异步上传文件

    移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传,(H5)FormData+AJAX异步上传文件

    localResizeIMG先压缩后使用ajax无刷新上传(移动端)

    下面通过文字说明和代码分析的方式给大家分享移动端图片上传之localResizeIMG先压缩后ajax无刷新上传,具体实现过程请看下文。 现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc...

    localResizeIMG4

    总的来说,`localResizeIMG4`是一个高效且实用的移动端图片上传解决方案,它结合了图片压缩和AJAX无刷新上传,能够帮助开发者创建性能优秀的移动应用。理解和掌握它的使用,对于优化用户体验和提高应用性能有着积极...

    SD规范 SDIO规范(全套规范)

    1 PartA2_SD Host_Controller_Simplified_Specification_Ver4.20 2 PartA2_SD_Host_Controller_Simplified_Specification_Ver2.00 3 PartE1_SDIO_Simplified_Specification_Ver2.00 4 PartE1_SDIO_Simplified_Specification_Ver3.00 5 Part1 PhysicalLayerSimplifiedSpecificationVer9.10Fin_20231201 6 PartE7_Wireless_LAN_Simplified_Addendum_Ver1.10 7 Part1_Extended_Security_Simplified_Addendum_Ver1.00 8 Part1_NFC_Interface_Simplified_Addendum_Ver1.00 9 Part1_UHS-II_Simplified_Addendum_Ver1.02 10 PartA1_ASSD_Extension_Simplified_Specification_Ver2.00 11 PartE2_SDIO Bluetooth_Type_A_Simplified_Specification_Ver1.00 12 SDUC-Host-Implementation-Guideline_Ver1.00

    元宇宙的未来:沉浸式互联网解锁万亿社交经济

    《步入元宇宙》由马克·范·里门撰写,是一本深入探讨元宇宙概念、历史、现状以及未来潜力的书籍。作者从Web 1.0到Web 3.0的发展讲起,详细分析了从增强现实(AR)到虚拟现实(VR)再到扩展现实(XR)的技术演进。书中提出了元宇宙的六大特征:互操作性、去中心化、持久性、空间性、社区驱动和自我主权,并强调了开放元宇宙的重要性及其带来的自由和创新潜力。作者还探讨了元宇宙对个人身份、商业、教育、娱乐等领域的深远影响,并预测了元宇宙将如何推动形成一个全新的社交经济。书中引用了多位行业专家的评价,强调了无论读者对元宇宙的了解程度如何,都能从中获得新的见解和启发。

    MW6S004的ads模型

    卢益峰ads仿真放大器章节所需的ads库和MW6S004的ads模型

    javaSE阶段面试题

    javaSE阶段面试题

    《网页制作基础教程(Dreamweaver-CS6版)》第10章-网站的管理与上传.pptx

    《网页制作基础教程(Dreamweaver-CS6版)》第10章-网站的管理与上传.pptx

    Abaqus双线盾构隧道超精细模型构建:涵盖软化模量与盾构注浆关键技术

    内容概要:本文详细介绍了如何使用Abaqus软件构建双线盾构隧道的超精细模型,特别是针对隧道间的联络通道、软化模量和盾构注浆等关键要素进行了深入探讨。文章首先阐述了模型的整体架构搭建,包括使用Python脚本创建隧道衬砌部件。接下来,讨论了软化模量的引入及其在材料本构模型中的定义方式,展示了如何通过塑性应变来模拟软化模量的变化。此外,文章详细讲解了盾构注浆的模拟方法,如通过单元生死技术激活注浆体单元,并提供了具体的Python代码示例。最后,文章强调了网格划分、接触设置等方面的注意事项,确保模型能够稳定运行并获得精确的结果。 适合人群:从事隧道工程数值模拟的研究人员和技术人员,尤其是熟悉Abaqus软件的工程师。 使用场景及目标:适用于需要进行双线盾构隧道工程力学行为研究的场合,旨在帮助工程师更好地理解和预测隧道施工过程中可能出现的问题,从而优化设计方案,提高施工效率和安全性。 其他说明:文中提供的代码片段和建模技巧基于作者的实际经验和测试结果,对于初学者而言,建议逐步尝试每个步骤并在实践中不断调整参数以适应具体工程项目的需求。

    《自然资源信息化时代背景与发展》.pdf

    《自然资源信息化时代背景与发展》.pdf

    《网络社会学(第2版)》15-网络社会变迁.ppt

    《网络社会学(第2版)》15-网络社会变迁.ppt

    西门子1214PLC与KTP700触摸屏构建双相机四轴多工位检测系统的实战案例

    内容概要:本文详细介绍了使用西门子1214PLC和KTP700Basic PN触摸屏构建双相机四轴多工位检测设备的具体实现方法。主要内容涵盖硬件配置、程序主体功能及其代码解析、触摸屏功能实现等方面。硬件方面,采用了西门子1214PLC作为核心控制器,KTP700Basic PN触摸屏为人机界面,双相机用于检测,第三设备通过Modbus RTU通讯。程序主体功能包括上下双工位4轴脉冲控制步进电机、与上位机双相机的TCP/IP通讯、与第三设备的Modbus RTU通讯。触摸屏功能则涉及多重画面、配方管理和密码保护等功能。文中还分享了一些调试经验和注意事项,如轴使能信号要用上升沿触发、相机通讯需配置心跳包机制等。 适合人群:从事工业自动化领域的工程师和技术人员,特别是那些对PLC编程、触摸屏应用和多工位检测设备感兴趣的读者。 使用场景及目标:适用于需要构建复杂自动化检测系统的工程项目,旨在提高检测效率和准确性,确保设备稳定可靠运行。通过学习本文,读者能够掌握如何使用西门子1214PLC和KTP700触摸屏搭建类似的检测系统。 其他说明:文中提供了大量具体的代码示例和调试技巧,有助于读者更好地理解和实施相关技术。此外,还强调了实际工程中常见的问题及解决方案,如接线和接地问题、通讯参数配置等。

    官方emmc规范(多个版本)

    - **4.4 版本** - 介绍了基础特性和标准,适合初学者了解eMMC的基本框架。 - **4.41 版本** - 对4.4版进行了修订和完善,优化了部分规范以适应市场和技术的发展。 - **4.5 版本** - 引入了新的性能改进和技术特性,进一步提升了存储效率。 - **4.51 版本** - 包含针对4.5版的小幅修正和增强,确保技术规范的准确性和实用性。 - **5.0 版本** - 重大更新,引入更多高级功能,支持更高的数据传输速率,对现代高性能需求进行了响应。 - **5.01 版本** - 在5.0基础上的维护更新,保持标准的一致性和先进性。 - **5.1 版本** - 最新的公开版本之一,提供了更全面的标准规范,加强了数据管理能力,提升了可靠性

    DeepSeek系列-提示词工程和落地场景.pdf

    DeepSeek系列-提示词工程和落地场景.pdf

    JDK(java)安装及配置

    JDK(java)安装及配置

    引力搜索算法(GSA)的MATLAB实现及其应用解析

    内容概要:本文详细介绍了引力搜索算法(Gravitational Search Algorithm, GSA)的原理、MATLAB实现及其应用场景。首先解释了GSA的基本概念,即将优化问题中的候选解视为宇宙中互相吸引的粒子,通过模拟物理现象进行优化。接着展示了核心的粒子运动方程,包括加速度计算、质量分配以及引力公式的具体实现。文中提供了多个经典的测试函数如Sphere、Rastrigin等用于验证算法性能,并通过动态绘图展示了粒子群的收敛过程。此外,讨论了算法参数设置的影响,如引力常数G的指数衰减方式,以及如何通过添加随机扰动避免粒子陷入局部最优。最后强调了GSA在解决多峰优化问题方面的优势。 适合人群:对优化算法感兴趣的科研人员、学生及工程师,尤其是那些希望深入了解群体智能算法的人。 使用场景及目标:适用于需要高效寻找全局最优解的问题,特别是在面对复杂的多峰函数时。目标是帮助读者理解GSA的工作机制,掌握其MATLAB实现方法,并能够根据实际情况调整参数以获得更好的优化效果。 其他说明:尽管GSA在低维问题上有出色表现,但在高维优化问题中可能存在效率瓶颈,因此建议进一步研究并行计算或近似邻居搜索等改进措施。

    基于Andorid的跨屏拖动应用设计.zip

    基于Andorid的跨屏拖动应用设计实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。

    DeepSeek R1 7b本地部署模型整合包及超全学习教程.rar

    DeepSeek R1 7b本地部署模型整合包及超全学习教程,资源总大小420G,喜欢的自行下载。

    精品推荐-最新人工智能训练师认证题库资料汇总(15份).zip

    精品推荐,最新人工智能训练师认证资料汇总,15份。供大家学习参考。 (新版)人工智能训练师(中级)职业技能等级认定考试题库.pdf 2025年人工智能训练师(高级)职业技能鉴定参考题库(含答案).pdf 阿里认证高级人工智能训练师真题.pdf 初级人工智能训练师题库.pdf 高级人工智能化训练师认证答案解析.doc 高级人工智能训练师.docx 高级人工智能训练师题库.pdf 人工智能技术应用基础课件:人工智能训练师.pdf 人工智能训练师(服务机器人人工智能技术应用)(学生组)理论题库.pdf 人工智能训练师(服务机器人人工智能技术应用)理论题库.docx 人工智能训练师概述课件.pdf 人工智能训练师基础(上册).pdf 人工智能训练师技能等级认定四级理论知识试卷.docx 人工智能训练师试题及答案(150题).pdf 人工智能训练师职业技能标准.pdf

Global site tag (gtag.js) - Google Analytics