java 实现上传文件到远程服务器
### Java 实现上传文件到远程服务器(Spring MVC) 在现代软件开发中,文件上传功能是十分常见的需求之一,尤其在Web应用中。本篇文章将详细介绍如何利用Java编程语言结合Spring MVC框架来实现文件的远程上传功能。具体实现过程中,我们会采用HTTP协议中的`POST`方法,并通过`multipart/form-data`编码格式来传输数据。 #### 关键概念和技术栈 1. **Spring MVC**: 是Spring框架的一部分,提供了一个构建Web应用的强大模型—视图—控制器架构。 2. **`multipart/form-data`**: 这是一种特殊的MIME类型,用于通过HTTP上传文件。 3. **HTTPURLConnection**: Java标准库提供的类,用于发送HTTP请求并接收响应。 #### 代码解析 ##### 类定义及初始化 ```java public class UploadUtil { private static UploadUtil uploadUtil; // ... public static UploadUtil getInstance() { if (null == uploadUtil) { uploadUtil = new UploadUtil(); } return uploadUtil; } // ... } ``` 这里定义了一个名为`UploadUtil`的工具类,采用了单例模式确保在整个应用中只有一个实例存在。这有利于资源的管理和复用。 ##### 常量定义 ```java private static final String BOUNDARY = UUID.randomUUID().toString(); private static final String PREFIX = "--"; private static final String LINE_END = "\r\n"; private static final String CONTENT_TYPE = "multipart/form-data"; // ... ``` 这些常量定义了文件上传时需要用到的一些关键字符串,如边界标识符、分隔符等。 ##### 文件上传逻辑 ```java public static String uploadFile(String filePath, String fileKey, HttpServletRequest req, Map<String, String> param) { ParameterBean parameter = CommonUtil.getParameterValue("SERVER_UPLOAD", req); if (!StringTools.isNullOrEmpty(parameter)) { File file = new File(filePath); return uploadFile(file, fileKey, "地址", param); } return null; } ``` `uploadFile`方法接收文件路径、文件键名、请求URL以及额外参数等信息,然后调用内部私有方法进行实际的文件上传操作。 ##### 内部上传逻辑 ```java private static String uploadFile(File file, String fileKey, String requestURL, Map<String, String> param) { String result = null; try { URL url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置连接属性 conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY); // 准备输出流 DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); // 构建表单 StringBuilder formBuilder = new StringBuilder(); formBuilder.append(PREFIX).append(BOUNDARY).append(LINE_END); formBuilder.append("Content-Disposition: form-data; name=\"").append(fileKey).append("\"; filename=\"") .append(file.getName()).append(LINE_END); formBuilder.append("Content-Type: application/octet-stream").append(LINE_END); formBuilder.append(LINE_END); dos.writeBytes(formBuilder.toString()); // 读取文件内容并写入输出流 FileInputStream fis = new FileInputStream(file); byte[] bytes = new byte[1024]; int len; while ((len = fis.read(bytes)) != -1) { dos.write(bytes, 0, len); } fis.close(); // 结束表单 dos.writeBytes(LINE_END); dos.writeBytes(PREFIX + BOUNDARY + PREFIX + LINE_END); // 发送请求 dos.flush(); dos.close(); // 处理响应 InputStream is = conn.getInputStream(); byte[] responseBytes = new byte[1024]; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((len = is.read(responseBytes)) != -1) { baos.write(responseBytes, 0, len); } result = baos.toString("UTF-8"); is.close(); } catch (MalformedURLException e) { // 处理异常 } catch (IOException e) { // 处理异常 } return result; } ``` 此方法首先建立一个HTTP连接,设置请求属性,然后构建表单数据,包括文件和其他参数。接下来,读取文件内容并写入到输出流中,最后发送请求并处理服务器返回的数据。 #### 总结 本文介绍了如何使用Java和Spring MVC实现文件的远程上传功能。通过详细的代码示例和解释,我们不仅了解了整个上传过程的细节,还学习了如何处理可能出现的各种异常情况。这对于构建健壮的Web应用程序是非常重要的。希望本文能帮助读者更好地理解和掌握文件上传的技术要点。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
/**
*
* 上传工具类
*/
public class UploadUtil
{
private static UploadUtil uploadUtil;
private static final String BOUNDARY = UUID.randomUUID().toString(); // 边界标识
// 随机生成
private static final String PREFIX = "--";
private static final String LINE_END = "\r\n";
private static final String CONTENT_TYPE = "multipart/form-data"; // 内容类型
private static final Logger logger = Logger.getLogger(UploadUtil.class);
* 单例模式获取上传工具类
*
* @return
*/
public static UploadUtil getInstance()
{
if (null == uploadUtil)
{
uploadUtil = new UploadUtil();
}
return uploadUtil;
}
private static int readTimeOut = 10 * 1000; // 读取超时
private static int connectTimeout = 10 * 1000; // 超时时间
/***
* 请求使用多长时间
*/
private static int requestTime = 0;
private static final String CHARSET = "utf-8"; // 设置编码
/***
* 上传成功
*/
public static final int UPLOAD_SUCCESS_CODE = 1;
/**
剩余7页未读,继续阅读
- 粉丝: 1
创作灵感
更多 >
我的内容管理
展开
我的资源
快来上传第一个资源
我的收益 登录查看自己的收益
我的积分
登录查看自己的积分
我的C币
登录后查看C币余额
我的收藏
我的下载
下载帮助
前往需求广场,查看用户热搜最新资源
- kinesisvideosignaling-jvm-1.2.47-sources.jar
- transcribe-1.5.9-javadoc.jar
- marketplaceentitlementservice-0.27.0-beta.jar
- rbin-jvm-1.4.70-javadoc.jar
- licensemanagerlinuxsubscriptions-jvm-1.1.23-sources.jar
- sagemakera2iruntime-jvm-1.2.43-javadoc.jar
- mediapackagevod-1.3.51-javadoc.jar
- org.hl7.fhir.convertors-6.0.24-javadoc.jar
- foundation-0.5.10-javadoc.jar
- cocoa-core-0.4.2.jar
- sns-jvm-1.4.57-sources.jar
- xray-jvm-1.2.12-javadoc.jar
- identitystore-jvm-1.4.67-javadoc.jar
- rdsdata-jvm-1.3.81-javadoc.jar
- simspaceweaver-jvm-1.4.3-sources.jar
- synthetics-jvm-1.0.78-sources.jar


信息提交成功
- 1
- 2
- 3
前往页