Java实现图片上传到服务器


#这几天研究图片上传到服务器并回显到页面遇到了问题,在这里总结一下!希望对各位有用!!!

先上代码

jsp代码:

<form id="myform" method="post" enctype="multipart/form-data">
                    <div class="form-group" >
                        <label for="plainGoodsName">商品名</label>
                        <input type="text" class="form-control" id="plainGoodsName" name="plainGoodsName" placeholder="请输入商品名">
                    </div>

                    <div class="form-group">
                        <label for="plainGoodsImg">商品图片</label>

                        <a style="float: left;border:1px solid #eee;width: 100%;padding: 10px;box-sizing: border-box;margin:5px 0;" href="javascript:;" class="a-upload">
                            <input type="file" name="files" id="plainGoodsImg" onchange="xmTanUploadImg_1(this,'xmTanImg_1')" accept="image/*"/>
                            <img style="width: 80px;" id="xmTanImg_1"/>
                            <div style="width: 80px;height: 80px;display: none;" id="xmTanDiv_1"></div>
                        </a>
                    </div>


                    <div class="form-group">
                        <label for="plainGoodsPrice">商品价格</label>
                        <input type="text" class="form-control" id="plainGoodsPrice" name="plainGoodsPrice" placeholder="请输入商品价格">
                    </div>

                    <div class="form-group">
                        <label for="plainGoodsNum">商品库存</label>
                        <input type="text" class="form-control" id="plainGoodsNum" name="plainGoodsNum" placeholder="商品库存">
                    </div>
                    <div class="form-group">
                        <label for="plainGoodsContext">商品描述</label>
                       <!-- <input type="text" class="form-control" id="plainGoodsContext" name="plainGoodsContext" placeholder="商品描述"> -->
                        <textarea class="form-control" id="plainGoodsContext" name="plainGoodsContext" rows="3"></textarea>
                    </div>
                    <div class="form-group">
                                 <label></label>
                             <button type="button" onclick="saveGoods()" class="btn btn-primary">添加商品</button>
                    </div>
                </form>

问题

第一、上传图片时form表单中加入 enctype=“multipart/form-data” 否则会出现问题 后台接收不到
(jsp的id接收后台传过来的值 通过标签赋值 name是向后台传值用的 如果没有name没法传值==这是给我自己写的)

js代码

var formData = new FormData($( "#myform" )[0]);
  $.ajax({
            url:"${ctx}/back/exchangeShopping/addGoods.action",
            type:"POST",
            dataType:"json",
            data:formData,
            processData: false,// 不加会报错
            contentType: false,// 不加会报错
            success:function(data) {
                if(data == "true"){
                    layer.msg('添加成功',{icon:6,time:1500,end:function () {
                            window.location.reload();
                        }});
                }else {
                    layer.msg(data,{icon:5,time:1500});
                }
            }
        })

有几个要注意的地方:
第一、ajax要加上两个属性
processData: false,// 不加会报错
contentType: false,// 不加会报错
第二、 var formData = new FormData($( “#myform” )[0]);
使用formdata序列化表单
关于jquery的 $(“form”).serialize()和 new FormData表单序列化
网址:
$(“form”).serialize()只会序列化表单不会序列化文件

问题:带文件上传的form表单序列化 传参问题
使用formdata 序列化form表单 后台使用@RequestParam(value = “files”, required = false)MultipartFile files,wFrontPlainGoods goods 接收
并且MultipartFile 名字要与页面name的名字相同

controller页面

@ResponseBody
	    @RequestMapping("/addGoods.action")
	    public String addGoods(@RequestParam(value = "files", required = false)MultipartFile files,wFrontPlainGoods goods){
	    	String Info = this.backExchangeShoppingService.addGoods(goods,files);
	        return JSONObject.toJSONString(Info);
	    }

后台 MultipartFile 接收文件 注意 名字要与页面起的名字一样(有些文章写的是名字一定不要一样 具体问题具体分析 我是小白不确定这个是为什么)
后面的对象时接收除文件以外的其他信息!

service页面:

//定义图片存储在服务器的路径
	public static final String PICTUREURL = "D:/nginx-1.13.8/html/slitLamp/screening/";
	public static final String CONFIGUREURL = "http://10.11.23.203:8029/";
	public String uploadPictureByFile(MultipartFile file) {
		// TODO 自动生成的方法存根
		String filename1 = "picture_" + UUID.randomUUID() + ".jpg";//生成唯一图片路径
		 if (!file.isEmpty()) {  
	            try {  
	                File filepath = new File(PICTUREURL);
	                if (!filepath.exists()) 
	                    filepath.mkdirs();
	                // 文件保存路径  
	               String savePath = PICTUREURL + filename1;  
	                // 转存文件  
	                file.transferTo(new File(savePath));  
	            } catch (Exception e) {  
	                e.printStackTrace();  
	            }  
	        }  

				String url = CONFIGUREURL + filename1;
		return url;
	}

问题
第一、D:/nginx-1.13.8/html/slitLamp/screening/ 为图片存在nginx下的路径
http://10.11.23.203:8029/ 为nginx的IP+端口 通过这个可以访问启动nginx的页面
第二、配置nginx 在nginx下的conf文件夹下的nginx.conf文件中配置图片储存路径`
第三、程序的图片是下载到本地的 使用nginx挂载本地的图片 然后启动nginx服务后通过nginx的IP+端口+(有可能还要加)+图片名访问

location ~ \.(gif|jpg|jpeg|png|bmp|swf)$              ###处理图片  
		{    
			root         D:/nginx-1.13.8/html/slitLamp/screening/;   ###对应的图片存入路径  
		}    

图片:![nginx配置图片]()