springboot文件上传

本文详细介绍了如何在SpringBoot应用中实现文件上传功能,包括配置MultipartFile、使用控制器处理上传请求、存储文件到本地或云存储服务,并讨论了文件大小限制及错误处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# application.yml配置  uploadserver为服务器路径
storage:
  local:
    uploadserver: http://127.0.0.1/FileServer/
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "storage.local")
public class LocalStorageConfig {
	/**
	 * 项目文件夹名
	 */
	public static final String PROJECT_NAME = "demo";
	/**
	 * 文件服务器
	 */
	private String uploadserver;

	public String getUploadserver() {
		return uploadserver;
	}

	public void setUploadserver(String fileserver) {
		this.uploadserver = fileserver;
	}

	/**
	 * @return 登录文件服务器的地址
	 */
	public String getLoginUrl() {
		return uploadserver + "login";
	}

	/**
	 * @return 上传文件的服务器地址
	 */
	public String getUploadUrl() {
		return uploadserver + "fileUpload";
	}

	/**
	 * @return 下载文件的服务器地址
	 */
	public String getAccessUrl() {
		return uploadserver + "uploads";
	}

}

	//controller层方法
	@Autowired
	private LocalStorageService localStorageService;
	@RequestMapping("/upload")
	public String upload(@RequestParam("file") MultipartFile file) throws Exception {
		if (file.isEmpty()) {
			return "error"
		}
		//上传文件
		String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
		String url = localStorageService.fileUpload(file.getBytes(), suffix);
		if (org.apache.commons.lang.StringUtils.isBlank(url)) {
			throw new RRException("上传文件失败");
		}

		return url;
	}
import java.io.File;

/**
 * 文件上传
 */
public interface LocalStorageService {

	String login() throws Exception;
	
	String fileUpload(File file, String postfix) throws Exception;

	String fileUpload(byte[] bytes, String postfix) throws Exception;
}


import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;


@Service("localStorageService")
public class LocalStorageServiceImpl implements LocalStorageService {
	private static final Logger logger = LoggerFactory.getLogger(LocalStorageServiceImpl.class);

	@Autowired
	private LocalStorageConfig config;

	private String[] session = null;

	/**
	 * 模拟浏览器POST提交数据方法 将装进HashMap的参数及值组合成URL并POST提交到web,
	 * 
	 * @return
	 * @throws Exception
	 */
	@Override
	public String login() throws Exception {
		session = null;
		Map<String, String> parMap = new HashMap<String, String>();
		parMap.put("username", "admin");
		parMap.put("signature", "123456");
		parMap.put("project", LocalStorageConfig.PROJECT_NAME);
		String resultSet = null;

		try {
			HttpURLConnection huc = (HttpURLConnection) new URL(config.getLoginUrl()).openConnection();
			// 指定HTTP内容类型及URL格式为form表单格式
			// huc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

			// 设置允许output
			huc.setDoOutput(true);
			// 设置提交方式为post方式
			huc.setRequestMethod("POST");
			String parameter = "";
			for (String key : parMap.keySet()) {
				// 组建参数URL并指定URL及参数编码格式
				parameter += key + "=" + java.net.URLEncoder.encode(parMap.get(key), "utf-8") + "&";
			}
			parameter = parameter.substring(0, parameter.length() - 1);
			OutputStream os = huc.getOutputStream();
			os.write(parameter.getBytes("utf-8"));// 指定URL及参数编码格式
			os.flush();
			os.close();
			// 执行提交后获取执行结果
			BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream()));
			huc.connect();
			String line = null;
			resultSet = br.readLine();
			// 循环按行读取文本流
			while ((line = br.readLine()) != null) {
				resultSet += line;// 此处未加上\r\n
			}
			br.close();
			resultSet = resultSet.trim();

			// 得到本次会话session,以便传文件时服务器确认身份
			logger.debug(JSON.toJSONString(huc.getHeaderFields()));
			session = huc.getHeaderField("Set-Cookie").split(";");
			logger.debug("sessionId:" + session[0]);

			huc.disconnect();
		} catch (Exception e) {
			logger.error("文件服务器无法登陆: " + config.getLoginUrl(), e);
		}

		return resultSet;
	}

	/***
	 * 上传文件到文件服务器,得到返回的文件的网络地址
	 * 
	 * @param file
	 * @param postfix
	 * @return
	 * @throws Exception
	 */
	@Override
	public String fileUpload(File file, String postfix) throws Exception {
		byte[] buffer = null;
		try {
			FileInputStream fis = new FileInputStream(file);
			ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
			byte[] b = new byte[1000];
			int n;
			while ((n = fis.read(b)) != -1) {
				bos.write(b, 0, n);
			}
			fis.close();
			bos.close();
			buffer = bos.toByteArray();
		} catch (FileNotFoundException e) {
			logger.error(e.getLocalizedMessage(), e);
		} catch (IOException e) {
			logger.error(e.getLocalizedMessage(), e);
		}
		return fileUpload(buffer, postfix);// 上传
	}

	/***
	 * 上传文件到文件服务器,得到返回的文件的网络地址
	 * 
	 * @param bytes
	 * @param postfix
	 * @return
	 * @throws Exception
	 */
	@Override
	public String fileUpload(byte[] bytes, String postfix) throws Exception {
		String resultSet = null;
		if (!"true".equals(login())) {
			return null;
		}

		try {
			HttpURLConnection huc = (HttpURLConnection) new URL(config.getUploadUrl()).openConnection();

			huc.setRequestMethod("POST");// 设置提交方式为post方式
			huc.setDoInput(true);
			huc.setDoOutput(true);// 设置允许output
			huc.setUseCaches(false);// POST不能使用缓存

			// 同步会话session
			if ((session == null || session.length == 0) && !"true".equals(login())) {
				throw new RuntimeException("文件服务器未登录");
			}
			huc.setRequestProperty("Cookie", session[0]);

			// 设置请求头信息
			huc.setRequestProperty("Connection", "Keep-Alive");
			huc.setRequestProperty("Charset", "UTF-8");

			// 设置边界
			String boundary = "----------" + System.currentTimeMillis();
			huc.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

			// 头部:
			StringBuilder sb = new StringBuilder();
			sb.append("--"); // 必须多两道线
			sb.append(boundary);
			sb.append("\r\n");
			sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"uploaded_file." + postfix + "\"\r\n");
			sb.append("Content-Type: application/octet-stream\r\n\r\n");

			// 获得输出流
			OutputStream out = new DataOutputStream(huc.getOutputStream());
			out.write(sb.toString().getBytes("utf-8"));// 写入header
			// 文件数据部分
			out.write(bytes, 0, bytes.length);// 写入文件数据

			// 结尾部分
			byte[] foot = ("\r\n--" + boundary + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
			out.write(foot);// 写入尾信息

			out.flush();
			out.close();

			// 执行提交后获取执行结果
			BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream()));
			huc.connect();
			String line = null;
			resultSet = br.readLine();

			// 循环按行读取文本流
			while ((line = br.readLine()) != null) {
				resultSet += line + "\r\n";// 此处未加上\r\n
			}
			br.close();
			resultSet = resultSet.trim();
			huc.disconnect();
		} catch (Exception e) {
			logger.error(e.getLocalizedMessage(), e);
			return null;
		}
		if (StringUtils.isBlank(resultSet)) {
			return null;
		} else {
			return config.getAccessUrl() + resultSet;
		}
	}
}

		/**
         * 图片上传
         */
        uploadingCheckPic: function () {
			var formData = new FormData();
			//类型为file的input框id
			var file = $("#checkPicUpload")[0].files[0];
			formData.append("file", file);
			$.ajax({
				type: "POST",
				url: "",
				contentType: false,
				processData: false,
				data: formData,
				success: function (r) {
					if (r.code == 0) {
		                
		            } else {
		                
		            }
					$("#checkPicUpload")[0].value = "";
				}
			});
		},
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值