spring+FormData包含业务参数的多图上传

13 篇文章 0 订阅

业务情况:上传多图,并且图片需要跟用户关联,上传过程还带有其他参数。

java框架:spring

<!DOCTYPE html>
<html>
  <head>
	<meta charset="utf-8">
    <title>formData多图+参数请求测试</title>
  </head>
  <style>
	  .choose {
	  	width: 100px;
	  	height: 40px;
	  	line-height: 40px;
	  	text-align: center;
	  	border: 1px solid green;
	  	border-radius: 13px;
	  	display: inline-block;
	  	margin-bottom: 10px;
	  }
	  .choose:HOVER{
	  	color: blue;
	  	background-color: #f7f7f7;
	  	cursor: pointer;
	  }
  </style>
  <body>
  	<div class="choose" οnclick="openFile()">选择材料</div>
  	<div class="choose" οnclick="upload()">上  传</div>
  	<input type="file" accept="image/*" id="file1" name="image_file1" multiple="multiple" style="display: none">
    <input type="file" accept="image/*" id="file2" name="image_file2" style="display: none">
  	<!-- <img id="img1" src="" class="photo"/>
    <img id="img2" src="" class="photo"/> -->
  
  
   <script src="../res/commons/js/jquery-1.11.0.min.js"></script>
   <script type="text/javascript">
   		/**
   		 * 打开文件选择框
   		 */
   		function openFile(){
   			$('#file1').val('');
   			$('.photo').attr('src','');
   			$('#file1').click();
   		}	
   		document.getElementById("file1").addEventListener('change',readFile,false);
   		
   		var imgArray = new Array();
   		var index = 0;
   		function readFile(){
   			index = 0;
			//this指代被监听的input对象
			if(this.files && this.files.length>0){
				for(var i=0; i<this.files.length; i++){
					var file = this.files[i];
					if(!file){
						return;
					}
					if(!/image\/\w+/.test(file.type)){
						alert("请确保文件为图像类型");
						return false;
					}
					if(file.size===0){
						alert("请确保图片大小不为0");
						return false;
					}
					//通过判断后,将文件读取加载出来显示
					var reader = new FileReader();
					reader.readAsDataURL(file);
					reader.onload = function(e){
						$('body').append('<img id="img'+(++index)+'" src="" class="photo" style="max-width:200px;display:block"/>');
						var img = document.getElementById("img"+(index));
			            img.src = this.result;
			            imgArray.push(file);
			        };
				}
			}
		}
		
   		function upload(){
   			var formdata = new FormData();
   			if(imgArray.length<=0){
   				alert('未选择图片,不能上传');
   				return;
   			}
   			for(var i=0 ; i<imgArray.length; i++){
   			
   				formdata.append("img"+(i+1),imgArray[i]);
   			}
   			formdata.append("userName","test");
   			formdata.append("userPassword","123456");
   			$.ajax({
				type: 'POST',
				url : '../formData/test1.do',
				contentType: false,//禁止编辑请求头
				processData: false,//禁止处理参数
				data : formdata,//获得第一个form中的信息,html表现为正面部分
				dataType: 'json',
				success: function(data){
					if(data.status==0){
						alert('成功');
					}
					else{
						alert(data.message);
					}						
					
				},
				error: function(data){
					alert('当前网络状况不好,请稍候重试。');
				}
			});
   		
   		}
   </script>
  </body>
</html>
package controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest;

import cn.com.startdima.vo.OperateResult;

@Controller
@RequestMapping("/formData")
public class FormDataTest 
{
	/**
	 * 测试接收FormData
	 * @return
	 */
	@RequestMapping("/test1.do")
	@ResponseBody
	public OperateResult test1(HttpServletRequest request,String userName,String userPassword)
	{	
		System.out.println("userName="+userName);
		System.out.println("userPassword="+userPassword);
		OperateResult result = new OperateResult();
		try {
			boolean isMultipart = ServletFileUpload.isMultipartContent(request);
	        if (isMultipart) {
	        	MultipartHttpServletRequest multipartHttpServletRequest = 
	        			(MultipartHttpServletRequest) request;
	        	Map<String, MultipartFile> list = multipartHttpServletRequest.getFileMap(); 
	        	Set<String> keys = list.keySet();
	        	for(String key : keys){
	        		System.out.println("key="+key);
	        		//将图片保存到本地
	        		MultipartFile file = list.get(key);
	        		String resourcePath = "D:/formDataTest";
	        		File path = new File(resourcePath);
	        		if(!path.exists()){
	        			path.mkdirs();
	        		}
	        		File upload = new File("/"+resourcePath+key+".jpg");
	        		
	        		file.transferTo(upload);
	        	}
	        }
			
			result.setStatus(0);
		} catch (Exception e) {
			e.printStackTrace();
			result.setStatus(1);
			result.setMessage(e.getMessage());
		}
		
		return result;
	}
}
测试通过,可以得到各个图片文件的参数名,这样就能用来跟用户的一些参数进行关联,下面可以开始实际应用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现vue+ajax+php的多图上传并回显,可以按照以下步骤进行: 1.在前端使用Vue的上传组件,设置multiple属性为true,允许用户上传多张图片。 2.在上传组件的change事件中获取用户选择的图片文件,使用FormData对象将图片文件封装成表单数据。 3.使用axios或其他网络请求库将表单数据发送到服务器端。 4.在服务器端接收到表单数据后,解析出图片文件并保存到服务器的指定文件夹中。 5.将图片文件的URL返回给前端,用于回显图片。 下面是一个简单的示例代码: 前端代码: ```html <template> <div> <input type="file" ref="fileInput" @change="handleUploadChange" multiple> <button @click="uploadImages">上传图片</button> <div v-if="imageUrls.length > 0"> <div v-for="imageUrl in imageUrls" :key="imageUrl"> <img :src="imageUrl" style="width: 200px; height: 200px;"> </div> </div> </div> </template> <script> import axios from 'axios' export default { data () { return { imageFiles: [], imageUrls: [] } }, methods: { handleUploadChange () { this.imageFiles = Array.from(this.$refs.fileInput.files) }, uploadImages () { const formData = new FormData() this.imageFiles.forEach(file => { formData.append('images[]', file) }) axios.post('/api/upload_images.php', formData) .then(response => { this.imageUrls = response.data.imageUrls }) .catch(error => { console.log(error) }) } } } </script> ``` 后端代码(使用PHP): ```php <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $imageUrls = []; $uploadDir = '/path/to/upload/folder/'; foreach ($_FILES['images']['error'] as $key => $error) { if ($error === UPLOAD_ERR_OK) { $tmpName = $_FILES['images']['tmp_name'][$key]; $fileName = basename($_FILES['images']['name'][$key]); $uploadPath = $uploadDir . $fileName; move_uploaded_file($tmpName, $uploadPath); $imageUrls[] = '/upload/' . $fileName; } } header('Content-Type: application/json'); echo json_encode(['imageUrls' => $imageUrls]); } ``` 在上面的示例代码中,使用了PHP的$_FILES变量来获取上传的图片文件。通过遍历$_FILES['images']['error']数组,可以判断每个文件是否上传成功。如果上传成功,将文件移动到指定的上传目录中,并将文件的URL保存到$imageUrls数组中。最后,将$imageUrls数组以JSON格式返回给前端,用于回显图片。 需要注意的是,上传文件时需要确保服务器端的上传目录有写入权限,否则会导致上传失败。同时,需要对上传的文件进行安全性检查,防止上传恶意文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值