FileStream経由でファイルをダウンロードする
MultipartFile
ファイルをアップロードし、ローカルにダウンロードし、保存パスを返すために使用する方法:
import org.springframework.web.multipart.MultipartFile;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileUtils {
private static final String UPLOAD_DIR = "/path/to/upload/directory/"; // 修改为您的上传目录
public static String saveFileAndGetPath(MultipartFile file) throws IOException {
String originalFileName = file.getOriginalFilename();
String fileName = generateFileName(originalFileName);
String filePath = UPLOAD_DIR + fileName;
try (InputStream inputStream = file.getInputStream();
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(filePath))) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
return filePath;
}
private static String generateFileName(String originalFileName) {
String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 时间戳精确到秒
int dotIndex = originalFileName.lastIndexOf(".");
String extension = (dotIndex != -1) ? originalFileName.substring(dotIndex) : "";
String fileNameWithoutExtension = (dotIndex != -1) ? originalFileName.substring(0, dotIndex) : originalFileName;
return fileNameWithoutExtension + "_" + timestamp + extension;
}
}
これは、Spring Boot アプリケーションでファイル ストリームを取得し、アップロードされたファイルを処理し、指定されたディレクトリにファイルを保存し、保存されたファイル パスを返すために使用されます。コードの各部分について簡単に説明します。
-
アップロード ディレクトリ設定: この例では、
UPLOAD_DIR
定数を使用してファイルをアップロードするためのディレクトリ パスを定義します。これを、アップロードしたファイルを実際に保存するパスに変更する必要があります。 -
ファイルを保存し、パスを取得します。
saveFileAndGetPath
メソッドは、MultipartFile
アップロードされたファイルを表すオブジェクトを受け取ります。このメソッドでは、アップロードされたファイルを指定されたディレクトリに保存し、保存されたファイルのパスを返します。 -
generate_filename :
generateFileName
ファイル名の衝突を避けるために、タイムスタンプ付きの新しいファイル名を生成するメソッドが使用されます。ファイル名の一部として現在の時刻 (秒まで正確) のタイムスタンプを使用し、元のファイル名の拡張子を保持します。 -
アップロード ロジック:
saveFileAndGetPath
メソッドでは、MultipartFile
オブジェクトの入力ストリームを使用して、アップロードされたファイルのコンテンツを読み取り、出力ストリームを通じて指定されたファイル パスにコンテンツを書き込みます。
ファイルアドレスごとにファイルをダウンロードする
package com.ruoyi.im.utils;
import com.ruoyi.common.config.RuoYiConfig;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
@Slf4j
public class FileUtils {
/**
* 默认路径
*/
private static String defaultBaseDir = RuoYiConfig.getProfile();
/**
* 下载并保存文件
*
* @param url url
* @param originalFileName 原始文件名字
* @return {@code String}
*/
public static String downloadAndSaveFile(String url, String originalFileName) {
try {
URL fileUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) fileUrl.openConnection();
connection.setRequestMethod("GET");
String fileName = generateFileNameWithTimestamp(originalFileName);
String savePath = generateSavePath(fileName);
try (InputStream inputStream = connection.getInputStream();
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(savePath))) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
return convertToReturnPath(savePath);
}
} catch (IOException e) {
e.printStackTrace();
log.error("Error: " + e.getMessage());
return null;
}
}
/**
* 生成文件名字和时间戳
*
* @param originalFileName 原始文件名字
* @return {@code String}
*/
private static String generateFileNameWithTimestamp(String originalFileName) {
String timestamp = getCurrentTimestamp();
int dotIndex = originalFileName.lastIndexOf(".");
String extension = "";
if (dotIndex != -1) {
extension = originalFileName.substring(dotIndex);
originalFileName = originalFileName.substring(0, dotIndex);
}
return originalFileName + "_" + timestamp + extension;
}
/**
* 生成保存路径
*
* @param fileName 文件名称
* @return {@code String}
*/
private static String generateSavePath(String fileName) {
Date currentDate = new Date();
SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");
SimpleDateFormat monthFormat = new SimpleDateFormat("MM");
SimpleDateFormat dayFormat = new SimpleDateFormat("dd");
String year = yearFormat.format(currentDate);
String month = monthFormat.format(currentDate);
String day = dayFormat.format(currentDate);
String filePath = defaultBaseDir + "/upload/" + year + "/" + month + "/" + day + "/";
return filePath + fileName;
}
/**
* 转换返回路径
*
* @param filePath 文件路径
* @return {@code String}
*/
private static String convertToReturnPath(String filePath) {
String relativePath = filePath.replace(defaultBaseDir, "/profile");
return relativePath.replace("\\", "/");
}
/**
* 获得当前时间戳
*
* @return {@code String}
*/
public static String getCurrentTimestamp() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
Date currentDate = new Date();
return dateFormat.format(currentDate);
}
}
ファイルの URL アドレスに従って、ファイルのダウンロード、保存、パス変換操作を処理するために使用されます。コードの各部分について簡単に説明します。
-
インポートとロギング: 必要なクラスとパッケージがインポートされ、
@Slf4j
アノテーションを使用してロギング コードが自動的に生成されます。 -
デフォルトのパスとメソッド:
defaultBaseDir
RuoYiConfig.getProfile()
:メソッドを通じて取得したデフォルトのファイル保存パスを、実際のファイル保存ディレクトリとして設定する必要があります。downloadAndSaveFile(String url, String originalFileName)
: ファイルをダウンロードしてローカルに保存し、ファイルの URL と元のファイル名をパラメータとして受け取ります。generateFileNameWithTimestamp(String originalFileName)
: 元のファイル名に基づいてタイムスタンプを付けた新しいファイル名を生成します。generateSavePath(String fileName)
: ファイル名に基づいて、年、月、日のサブディレクトリを含む保存ファイル パスを生成します。convertToReturnPath(String filePath)
: ファイル パスを、返された相対パス形式に変換します。
-
ファイルのダウンロード ロジック:
downloadAndSaveFile
このメソッドでは、URL 接続を作成することで接続を開き、ファイル ストリームを取得します。次に、入力ストリームと出力ストリームを使用してファイルを指定されたディレクトリにローカルに保存し、競合を避けるために新しいファイル名を生成します。 -
保存パスの生成: 現在の日付と時刻を使用して、年、月、日のサブディレクトリを含む保存ファイル パスを生成します。
-
Convert Return Path : 保存されたファイル パスを、
/profile
デフォルト パスを基準とした相対パス形式に変換します。 -
現在のタイムスタンプを取得する:
getCurrentTimestamp
メソッドを通じて現在の時刻のタイムスタンプを秒単位で取得し、それを使用してタイムスタンプ付きのファイル名を生成します。
具体的な用途
とても簡単で、直接呼び出すだけです。!!
@GetMapping("/download")
public AjaxResult downloadFilebyUrl(@RequestParam String url, @RequestParam String fielName) {
String path = FileUtils.downloadAndSaveFile(url, fielName);
if (StringUtils.isNotBlank(path)) {
return AjaxResult.success(path);
} else {
return AjaxResult.error("文件下载失败!!!");
}
}