java中怎么实现后台图片跨域上传功能
创始人
2024-12-21 23:01:01
0次

跨域的原因

在项目开发的过程中,我们经常需要用到图片上传操作,传统的做法是我们将其上传到项目的所在目录中,比如说项目的target目录中,但是由于项目在重启的过程中,target文件夹下的内容会被全部清空,这意味着如果采用这种方式,那么在测试环境与开发环境;在每一次的项目重启的过程中,我们经常会遭遇图片丢失的情况,这种情况有时往往很让人头疼,因而有一个图片服务器对于项目的开发和测试而言,这是十分必要的。

跨域的实现原理

在采用图片服务器的情况下,我们只需要像往常一样,由前台界面将图片上传到本地项目服务器中,然后本地的项目服务器会将该图片的数据流写入到远程的图片服务器中,由远程的图片服务器负责图片的存储,最后,远程的图片服务器会返回一个存储图片路径,在本地的服务器只需要存储该路径,在页面展示的时候,只需要在前台将该图片路径展示出来,即可完成对于远程图片服务器的调用。

本地服务器源码

@ResponseBody @RequestMapping(value="/imgUpLoadNewOneKuaYu") public String imgUpLoadNewOneKuaYu(HttpServletRequest request) throws IOException {   String urlStr = "http://localhost:9080/no-js/admin/upload";   Map textMap = new HashMap();    MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;//流的数据*   //取得request中的所有文件名     Iterator iter = multiRequest.getFileNames();     Map fileMap = new HashMap();    if(iter.hasNext()){      //取得上传文件      MultipartFile file = multiRequest.getFile(iter.next());      if(file != null){       //取得当前上传文件的文件名称       String myFileName = file.getOriginalFilename();      InputStream fileInputStream=file.getInputStream();       fileMap.put(myFileName, fileInputStream);      }    }   String ret = FileUpLoadNew.formUpload(urlStr, textMap, fileMap);   System.out.println(ret);   return ret; }

FileUpLoadNew

package net.sahv.bdyz.util;import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.FileInputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.Iterator;import java.util.Map;public class FileUpLoadNew { /**  * @param urlStr  * @param textMap  * @param fileMap  * @return  */ public static String formUpload(String urlStr, Map textMap, Map fileMap) {  String res = "";  HttpURLConnection conn = null;  String BOUNDARY = "---------------------------123821742118716"; //boundary就是request头和上传文件内容的分隔符  try {   URL url = new URL(urlStr);   conn = (HttpURLConnection) url.openConnection();   conn.setConnectTimeout(5000);   conn.setReadTimeout(30000);   conn.setDoOutput(true);   conn.setDoInput(true);   conn.setUseCaches(false);   conn.setRequestMethod("POST");   conn.setRequestProperty("Connection", "Keep-Alive");   conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");   conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);   OutputStream out = new DataOutputStream(conn.getOutputStream());   // textMap:如果传送的是文本内容   if (textMap != null) {    StringBuffer strBuf = new StringBuffer();    Iterator> iter = textMap.entrySet().iterator();    while (iter.hasNext()) {     Map.Entry entry = iter.next();     String inputName = (String) entry.getKey();     String inputValue = (String) entry.getValue();     if (inputValue == null) {      continue;     }     strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");     strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"\r\n\r\n");     strBuf.append(inputValue);    }    out.write(strBuf.toString().getBytes());   }   //fileMap:如果传送的是文件流   if (fileMap != null) {    Iterator> iter = fileMap.entrySet().iterator();    while (iter.hasNext()) {     Map.Entry entry = iter.next();     String inputName = (String) entry.getKey();     FileInputStream inputValue = (FileInputStream) entry.getValue();     if (inputValue == null) {      continue;     }     String contentType = "image/png";     StringBuffer strBuf = new StringBuffer();     strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");     strBuf.append("Content-Disposition: form-data; name=\"" + inputName + "\"; filename=\"" + inputName + "\"\r\n");     strBuf.append("Content-Type:" + contentType + "\r\n\r\n");     out.write(strBuf.toString().getBytes());     DataInputStream in = new DataInputStream(inputValue);     int bytes = 0;     byte[] bufferOut = new byte[1024];     while ((bytes = in.read(bufferOut)) != -1) {      out.write(bufferOut, 0, bytes);     }     in.close();    }   }   byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();   out.write(endData);   out.flush();   out.close();   // 读取返回数据   StringBuffer strBuf = new StringBuffer();   BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));   String line = null;   while ((line = reader.readLine()) != null) {    strBuf.append(line).append("\n");   }   res = strBuf.toString();   reader.close();   reader = null;  } catch (Exception e) {   System.out.println("发送POST请求出错。" + urlStr);   e.printStackTrace();  } finally {   //最后关闭链接   if (conn != null) {    conn.disconnect();    conn = null;   }  }  return res; }}

图片服务器源码

package com.lyc.noJs.controller;import com.google.common.base.Splitter;import com.lyc.noJs.util.ImgMD5Util;import lombok.extern.slf4j.Slf4j;import org.joda.time.DateTime;import org.springframework.stereotype.Controller;import org.springframework.util.MultiValueMap;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.multipart.MultipartFile;import org.springframework.web.multipart.MultipartHttpServletRequest;import java.io.*;import java.security.NoSuchAlgorithmException;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;@Controller@RequestMapping("/admin")@Slf4jpublic class UploadController { @ResponseBody @RequestMapping(value = "/upload",method= RequestMethod.POST) public String upload(MultipartHttpServletRequest multiRequest) throws UnsupportedEncodingException {  //图片文件夹根路径  //TODO  //这里的父路径暂时是target路径,在真实上线后,应该将其改成其它路径。  String uploadFilePath = multiRequest.getServletContext().getRealPath("/upload/");  //图片文件夹日期路径  String datePath = getDateFolderName() + "\\";  //图片名称  String imagePath = saveImage(multiRequest,uploadFilePath,datePath);  log.info(imagePath);  return imagePath; } /**  * 保存图片  * @param multiRequest  * @param uploadFilePath  * @param datePath  * @return  * @throws UnsupportedEncodingException  */ public String saveImage(MultipartHttpServletRequest multiRequest,String uploadFilePath,String datePath) throws UnsupportedEncodingException {  String imageNameHead = createImageNameHead();  String imageName = "";  //设置图片的浏览为utf-8格式,防止图片名称乱码  multiRequest.setCharacterEncoding("utf-8");  MultiValueMap multiFileMap = multiRequest.getMultiFileMap();  Set>> set = multiFileMap.entrySet();  Iterator>> iterator = set.iterator();  while(iterator.hasNext()){   Map.Entry> entry = iterator.next();   String imageNameEnd = getImageNameEnd(entry);   imageName = imageNameHead + "." + imageNameEnd;   List multipartFileList = entry.getValue();   MultipartFile multipartFile = multipartFileList.get(0);   //图片文件的包路径   String imagePath = uploadFilePath + datePath;   //如果文件夹创建失败,则返回null   if(makeParentFolder(imagePath)){  //如果文件夹创建失败,则返回false,否则返回true    //图片文件的路径    String imgFile = imagePath + imageName;    //如果文件创建失败,则返回null    if(!makeImage(multipartFile,imgFile)){ //当文件创建失败时,返回false,否则返回true     return null;    }   } else {    return null;   }  }  return datePath + imageName; } /**  * 创建图片  * @param multipartFile  * @param imgFile  * @return  */ public boolean makeImage(MultipartFile multipartFile,String imgFile){  File tempFile = new File(imgFile);  if(tempFile != null){   //如果原图片不存在,则生成图片   if(!tempFile.exists()){    try {     log.info("1");     multipartFile.transferTo(tempFile);    } catch (IOException e) {     e.printStackTrace();    }   }   return true;  }  return false; } /**  * 创建父文件路径  * @param imagePath  * @return  */ public boolean makeParentFolder(String imagePath){  File parentFile = new File(imagePath);  if(parentFile != null){   while (!parentFile.exists()){    //批量生成全部的父文件路径    parentFile.mkdirs();   }   return true;  }  return false; } /**  * 文件夹生成规则  */ public String getDateFolderName(){  DateTime dataTime = new DateTime();  String currentDate = dataTime.toString("yyyy\\MM\\dd");  return currentDate; } /**  * 创建图片文件的文件名  * @return  */ public String createImageNameHead(){  DateTime dataTime = new DateTime();  return String.valueOf(dataTime.getMillis()); }}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...