Java后端上传文件

package com.xxx.framework.common.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

/**
 * 文件上传工具类
 * @author liuxh
 */
public class FileUtils {
	private static Logger log = LoggerFactory.getLogger(FileUtils.class);
	
    // 超时时间
    private static final int TIME_OUT = 100 * 1000;
    // 边界标识 随机生成
    private static final String BOUNDARY = "letv";
    private static final String PREFIX = "--";
    private static final String LINE_END = "\r\n";
    // 内容类型
    private static final String CONTENT_TYPE = "multipart/form-data";

    /**
     * 上传文件到服务器
     *
     * @param file 需要上传的文件
     * @param fileName 自定义上传文件的名称
     * @param requestURL 文件服务器的rul
     * @return 返回响应的内容
     *
     */
    public static String upload(File file, String fileName, String requestURL) throws IOException {
        log.info("FileUtils upload start, fileName : {}, url : {}", file.getName(), requestURL);
        String result = null;
        URL testUrl = new URL(requestURL);
        HttpURLConnection urlConnection = (HttpURLConnection)testUrl.openConnection();
        try {
            urlConnection.connect();
        } catch (IOException e) {
            throw new ConnectException(e.getMessage());
        } finally {
            urlConnection.disconnect();
        }

        URL url = new URL(requestURL);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        try {
            conn.setReadTimeout(TIME_OUT);
            conn.setConnectTimeout(TIME_OUT);
            // 允许输入流
            conn.setDoInput(true);
            // 允许输出流
            conn.setDoOutput(true);
            // 不允许使用缓存
            conn.setUseCaches(false);
            // 请求方式
            conn.setRequestMethod("POST");
            // 设置编码
            conn.setRequestProperty("Charset", StandardCharsets.UTF_8.name());
            conn.setRequestProperty("connection", "keep-alive");
            conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);

            if (file != null) {
                /*
                 * 当文件不为空,把文件包装并且上传
                 */
                DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
                StringBuffer sb = new StringBuffer();
                sb.append(PREFIX);
                sb.append(BOUNDARY);
                sb.append(LINE_END);
                /*
                 * 这里重点注意: name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件
                 * filename是文件的名字,包含后缀名的 比如:abc.png
                 */
                // 有传名称时用名称,未传名称时直接获取文件名
                String name = fileName == null || "".equals(fileName) ? file.getName() : fileName;
                log.info("FileUtils upload file name: {}", name);
                sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + name + "\"" + LINE_END);
                sb.append("Content-Type: application/ctet-stream" + LINE_END);
                sb.append(LINE_END);
                /*
                 * 这里getBytes("UTF-8")是关键,否则传到服务端文件名会乱码,
                 * 若是在file.getName()处编码,则需要在服务端进行解码,
                 * 为了服务端的接口前后端共用,不再在服务端处理编码
                 */
                dos.write(sb.toString().getBytes(StandardCharsets.UTF_8.name()));
                InputStream is = new FileInputStream(file);
                byte[] bytes = new byte[1024 * 1024];
                int len = 0;
                while ((len = is.read(bytes)) != -1) {
                    dos.write(bytes, 0, len);
                }
                is.close();
                dos.write(LINE_END.getBytes());
                byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
                dos.write(end_data);
                dos.flush();

                InputStream input = conn.getInputStream();
                StringBuffer sb1 = new StringBuffer();
                int ss;
                while ((ss = input.read()) != -1) {
                    sb1.append((char) ss);
                }
                result = sb1.toString();
                result = new String(result.getBytes(StandardCharsets.ISO_8859_1.name()), StandardCharsets.UTF_8.name());
            }
        } catch (MalformedURLException e) {
            log.error("FileUtils upload MalformedURLException msg : {}", e.getMessage());
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            log.error("FileUtils upload IOException msg : {}", e.getMessage());
            e.printStackTrace();
            return null;
        } finally {
            conn.disconnect();
        }
        log.info("FileUtils upload end, result : {}", result);
        return result;
    }
    
	/**
	 * 有时候是MultipartFile,可以通过这个方法把MultipartFile.getInputStream()转成File
	 */
    public static void inputStreamToFile(InputStream ins,File file) {
        try {
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 后端可以使用 Apache Commons FileUpload 库来实现文件上传功能。以下是一个简单的示例代码: ``` import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 检查是否为文件上传请求 boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Not a multipart request"); return; } // 创建文件上传工厂和解析器 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { // 解析上传的文件 List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { // 如果是普通表单字段,直接输出其名称和值 if (item.isFormField()) { System.out.println(item.getFieldName() + ": " + item.getString()); } // 如果是文件字段,保存到服务器上的指定目录 else { String fileName = item.getName(); File uploadedFile = new File("/path/to/upload/directory", fileName); item.write(uploadedFile); System.out.println("File uploaded: " + fileName); } } } catch (Exception e) { e.printStackTrace(); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Internal server error"); } } } ``` 在上述代码中,我们首先检查请求是否为文件上传请求,然后创建文件上传工厂和解析器。接着,我们解析上传的文件,对于普通表单字段,直接输出其名称和值,对于文件字段,将其保存到服务器上的指定目录。注意,这里的上传目录需要根据实际情况进行修改。 以上就是 Java 后端上传文件到服务器的简单示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值