最简单的多图上传,放大,删除操作

本文介绍了一种实现多图上传与预览的技术方案,包括HTML、jQuery和PHP的综合应用。通过代码示例详细解释了如何实现单图与多图上传、图片预览、图片删除及放大查看等功能。

多图上传都遇到过得事情,一开始我还用底层支持多图的方式,咋咋的。直到看到公司同事写的多图上传,觉得可以借鉴,分享也为了以后使用。直接代码
(单图多图都支持的)
必须要有1.8.3.min.js 还有需要 必须 layer.js
代码上

HTML


//多图上传 主要是三个 第一个是id priview_sq_img1 for="sq_img1"  对应层级遍历到什么html中
//第二个是 srcChanged('author_img', 'sq_img1') author_img 对应数据库字段 sq_img1对应层级
//第三个是input 里边的参数 multiple是否多图上传标识 data-maxnum最大上传数量
<div class="flexL" id="preview_sq_img1">
     <{if $jxsInfo.author_img && $jxsInfo.author_img != ''}>
     <{foreach from=$jxsInfo.author_img key=key item=item}>
     <div class="Uploadimgs flexL">
         <img src="<{$item}>" onclick="picview(this)" class="mr-15"/>
         <i style="background-color: #333;" onclick="removeImg(this, 'author_img')">&#10005;</i>
     </div>
     <{/foreach}>
     <{/if}>
 </div>
 <label for="sq_img1" class="uploadimgcom">
     <input id="" type="file" name="">
     <span>上传图片</span>
     <input id="sq_img1" onchange="srcChanged('author_img', 'sq_img1');" data-maxnum="10" type="file" multiple="multiple" style="display: none;">
 </label>
//单图上传 同上注意点
<div class="flexL">
        <div class="flexL" id="preview_bb_img">
             <{if $jxsInfo.jxs_banner_img && $jxsInfo.jxs_banner_img != ''}>
             <div class="Uploadimgs flexL">
                 <img src="<{$jxsInfo.jxs_banner_img}>" onclick="picview(this)"  class="mr-15"/>
                 <i style="background-color: #333;" onclick="removeImg(this, 'jxs_banner_img')">&#10005;</i>
             </div>
             <{/if}>
         </div>
         <label for="bb_img" class="uploadimgcom">
             <input id="" type="file" name="">
             <span>banner图上传</span>
             <input id="bb_img" onchange="srcChanged('jxs_banner_img', 'bb_img');" type="file" style="display: none;">
         </label>
     </div>
 </div>
//需要有个input 隐藏域 存数据 id都和上边的对应 
<input type="hidden" id="head_img" name="head_img" value="<{$jxsInfo.head_img}>">
<input type="hidden" id="license_img" name="license_img" value="<{$jxsInfo.license_img}>">
<input type="hidden" id="author_img" name="author_img" value="<{implode(',',$jxsInfo.author_img)}>">

**JQ 有三个 picview放大操作 removeImg多张图删除 srcChanged上传图片 **

//移除图片 fileId 移除删层 父级 和本级 以及对应字段的数据
function removeImg(r, fileId) {
    var picsrc = $(r).prev('div').children('img').attr('src');
    var ptObj = $("#" + fileId).val().split(',');
    var idx = $.inArray(picsrc, ptObj);
    if(confirm("确定删除当前图片")){
        if (idx != -1) {
            ptObj.splice(idx, 1);
            $("#" + fileId).val(ptObj.join());
            $(r).prev('img').remove();
            $(r).parent().remove();
        } else {
            layer.alert('删除图片失败');
        }
    }
    
}
//图片放大
function picview(Obj) {
    var img_url = $(Obj).attr('src');  
    var img = new Image();  
    img.src = img_url;
    layer.open({
        type: 1,
        title: false,
        closeBtn: 0,
        area: [img.width + 'px', img.height + 'px'], //宽高
        shadeClose: true,
        content: "<img src=" + img_url + " />"
    });
}
//上传图片
function srcChanged(fileId, previewId) {
    var files = $('#' + previewId)[0].files;
    var maxNum = $('#' + previewId).data('maxnum');   //最多上传5张图片
    var picnum = $('#preview_' + previewId).children('img').length;
    var fileCount = files.length;
    if (fileCount + picnum >= maxNum + 1) {
        alert("最多只能上传"+maxNum+"图片");
        return false;
    } else {
        var formData = new FormData();
        for (var i = 0; i < fileCount; i++) {
            formData.append("fileupload[]", files[i]);   // 文件对象 ,fileupload必须加中括号   
        }
        //也可以根据fileId 的不同拓展不同的大小 或者宽高 以及 格式(jpg/png/bmp)
        formData.append("thumb", '1');
        formData.append("thumb_width", '60');
        formData.append("thumb_height", '60');
        //需要存放的路径 开头 /static/uploads/content/jxs_author/日期-今日/图片集
        //根据需求自己改
        formData.append("pictype", 'jxs_author');
    }
    layer.load(2);
    $.ajax({
    	//php代码在下
        url: '/uploadFile/upImage/',
        type: 'POST',
        cache: false,
        data: formData,
        processData: false,
        contentType: false,
        dataType: 'json'
    }).done(function (res) {
        layer.closeAll('loading');
        if (res.resultId == 0) {
            var picurl = res.Data;
            //多图处理
            if ($("#" + previewId).prop('multiple')) {
                var html = '';
                var valObj = [];
                if ($("#" + fileId).val() !== '') {
                    valObj = $("#" + fileId).val().split(",");
                }
                $.each(picurl, function (key, val) {
                    html += ' <div class="Uploadimgs flexL"><img src="' + val + '" onclick="picview(this)" class="mr-15"/>';
                    html += " <i style=\"background-color: #333;\" onclick=\"removeImg(this,'" + fileId + "')\">&#10005;</i></div>";
                    valObj.push(val);
                });
                $('#preview_' + previewId).append(html);
                $("#" + fileId).val(valObj.join());
            } else {
           		//单图操作
                var html = '';
                html += ' <div class="Uploadimgs flexL"><img src="' + picurl[0] + '" onclick="picview(this)" class="mr-15"/>';
                html += " <i style=\"background-color: #333;\" onclick=\"removeImg(this,'" + fileId + "')\">&#10005;</i></div>";
                $('#preview_' + previewId).html(html);
                $("#" + fileId).val(picurl[0]);
            }


        } else {
            layer.alert(res.Data);
        }
    }).fail(function (res) {
        layer.closeAll('loading');
        layer.alert('出错了!');
    });
}

PHP
我整理一下 只是针对这次 多图单图上传

private $upconfig = [
		
	'allowSuffix'=> ["jpg","jpeg", "png", "pjpeg","gif","bmp","x-png","csv",'xlsx','xls','pdf'],
	
	'rootPath'=> "./static/uploads/",
	
	'savePath'=> "content/",
	
	'maxSize'=> 2097152, //2M 2 * 1024 * 1024;
	
	'maxHeight'=> 300,
	
	'maxWidth'=>450
];

public function upImageAction(){
	if (isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST") {
		$photoimg = $_FILES['photoimg'];
		$photoimg1 = $_FILES['photoimg1'];
		$import_data = $_FILES['import_data'];

		$className = "preview";
		if ((isset($photoimg['name']) && !empty($photoimg['name']))) {
			$className = "preview";
		} else {
			$photoimg = $photoimg1;
			$className = "preview1";
		}
		//jq代码中的 jxs_author
		if(isset($_POST['pictype']) && !empty($_POST['pictype'])){
			$this->upconfig['savePath'] = 'content/'.$_POST['pictype'].'/';
		}
		//上方 $this->upconfig
		$up_ins = Comm_Uploadimg::getInstance($this->upconfig);
		$res = $up_ins->uploadFile();
		
		if($res){
			if(in_array($action,$no_compress_action)){
				//$info =  substr($this->upconfig['rootPath'], 1) . $res['savepath'] . $res['savename'];
				//echo '<img style="padding-right: 5px;" src="' . $info . '"  class="' . $className . '">';
				//exit;
				$img_ins = Comm_Image::getInstance();
				foreach($res as $file){
					$imgpath =  $this->upconfig['rootPath'] . $file['savepath'] . $file['savename'];
					if(in_array($file['ext'],$img_ins->compress_type)){
						$img_ins->open($imgpath)->compress(950,650)->save($imgpath);//压缩处理;
					}
					$info[] = substr($imgpath, 1);
				}
				$response = Comm_Tools::returnMsg(0,$info,1);
			}
		}else{
			$response = Comm_Tools::returnMsg(1,$up_ins->getError(),1);
		}
		exit($response);
	}
}
基于 NSFW Model 色情图片识别鉴黄 后面更新视频检测 项目背景: 随着互联网的快速发展,网络上的信息量呈现出爆炸式的增长。然而,互联网上的内容良莠不齐,其中不乏一些不良信息,如色情、暴力等。这些信息对青少年的健康成长和社会风气产生了不良影响。为了净化网络环境,保护青少年免受不良信息的侵害,我国政府加大了对网络内容的监管力度。在此背景下,本项目应运而生,旨在实现对网络图片和视频的自动识别与过滤,助力构建清朗的网络空间。 项目简介: 本项目基于 NSFW(Not Safe For Work)Model,利用深度学习技术对色情图片进行识别与鉴黄。NSFW Model 是一种基于卷积神经网络(CNN)的图像识别模型,通过学习大量的色情图片和非色情图片,能够准确地判断一张图片是否含有色情内容。本项目在 NSFW Model 的基础上,进一步优化了模型结构,提高了识别的准确率和效率。 项目功能: 色情图片识别:用户上传图片后,系统会自动调用 NSFW Model 对图片进行识别,判断图片是否含有色情内容。如果含有色情内容,系统会给出相应的提示,并阻止图片的传播。 视频检测:针对网络视频,本项目采用帧提取技术,将视频分解为一帧帧图片,然后使用 NSFW Model 对这些图片进行识别。如果检测到含有色情内容的图片,系统会给出相应的提示,并阻止视频的传播。 实时监控:本项目可应用于网络直播、短视频平台等场景,实时监控画面内容,一旦检测到含有色情内容的画面,立即进行屏蔽处理,确保网络环境的纯洁。
### 如何在本地部署 NSFW 模型或服务 要在本地环境中成功部署 NSFW(不适宜工作场合内容)检测模型或服务,以下是详细的说明: #### 准备环境 为了确保能够顺利运行模型和服务,需要安装必要的依赖项。这些工具和库包括但不限于以下几类: - **Python 环境**: 推荐使用 Python 3.7 或更高版本。 - **Transformers 库**: 提供加载预训练模型的功能[^1]。 - **PyTorch/TensorFlow**: 支持深度学习框架的计算需求。 - **Pillow (PIL)**: 处理图像文件并将其转换为适合输入模型的形式。 具体命令如下所示: ```bash pip install transformers torch Pillow ``` #### 加载模型与测试 通过 Hugging Face 的 `transformers` 工具包可以直接访问已有的 NSFW 图片分类模型。例如,可以采用名为 `"Falconsai/nsfw_image_detection"` 的公开模型来完成此任务[^1]。 下面是一个简单的代码片段展示如何加载该模型并对单张图片执行预测操作: ```python from PIL import Image from transformers import pipeline def classify_nsfw(image_path): # 打开指定路径下的图片文件 img = Image.open(image_path) # 初始化 image-classification 流水线对象,并指明使用的特定模型名称 classifier = pipeline("image-classification", model="Falconsai/nsfw_image_detection") # 对传入的图片调用流水线方法得到其类别标签及其置信度分数列表形式的结果 result = classifier(img) return result if __name__ == "__main__": test_img_path = "<your_test_image>" output_results = classify_nsfw(test_img_path) print(output_results) ``` 注意替换 `<your_test_image>` 成实际存在的图片绝对或者相对地址字符串值之前再尝试运行以上脚本。 #### 构建 RESTful API 服务 如果希望进一步扩展功能至 Web 应用程序层面,则可考虑利用 Flask/Django 这样的轻量级 web 开发框架构建起支持 HTTP 请求交互的服务端接口。这里给出基于 FastAPI 实现的一个简单例子作为示范用途: ```python import uvicorn from fastapi import FastAPI, File, UploadFile from PIL import Image from io import BytesIO from typing import List from pydantic import BaseModel app = FastAPI() class Prediction(BaseModel): label: str score: float @app.post("/predict/", response_model=List[Prediction]) async def predict(file: UploadFile = File(...)): try: contents = await file.read() pil_image = Image.open(BytesIO(contents)) clf_pipeline = pipeline('image-classification', model='Falconsai/nsfw_image_detection') predictions = clf_pipeline(pil_image) formatted_preds = [{"label": pred['label'], "score": round(pred['score'], 4)} for pred in predictions] return formatted_preds except Exception as e: raise ValueError(f"Error processing uploaded file {e}") if __name__ == '__main__': uvicorn.run(app, host='0.0.0.0', port=8000) ``` 启动服务器之后即可向 `/predict/` 路径发送 POST 请求附带上传待分析的目标图片获取返回结果了。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值