Aliyun OSSとRuoYiフレームワークを用いて画像のアップロードとプレビューを実現する

Aliyun OSSの準備

  • Aliyunアカウントにログインし、OSSサービスを検索します。
  • Bucketを作成します(作成後、公開読み取り許可を設定してください)。
  • アクセスキーを生成します。
  • 環境変数にアクセスキーを設定します。

環境変数の設定方法

set ALI_OSS_KEY_ID=あなたのアクセスキーID
set ALI_OSS_KEY_SECRET=あなたのアクセスキーシークレット

setx ALI_OSS_KEY_ID "%ALI_OSS_KEY_ID%"
setx ALI_OSS_KEY_SECRET "%ALI_OSS_KEY_SECRET%"

SDKを使用した画像アップロードのテスト

以下のJavaコードを参考に画像をアップロードします。

public class ImageUploader {
    public static void main(String[] args) throws Exception {
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        String bucketName = "demosystem-file";
        String objectName = "testimage.jpg";
        String filePath= "C:\\Users\\User\\Documents\\test\\demosystem.jpg";
        String region = "cn-beijing";

        ClientBuilderConfiguration config = new ClientBuilderConfiguration();
        config.setSignatureVersion(SignVersion.V4);
        OSS ossClient = new OSSClientBuilder()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(config)
                .region(region)
                .build();

        try {
            InputStream input = new FileInputStream(filePath);
            PutObjectRequest request = new PutObjectRequest(bucketName, objectName, input);
            PutObjectResult result = ossClient.putObject(request);
        } catch (OSSException oe) {
            System.out.println("OSSExceptionが発生しました:");
            System.out.println("エラーメッセージ: " + oe.getErrorMessage());
            System.out.println("エラーコード: " + oe.getErrorCode());
        } catch (ClientException ce) {
            System.out.println("ClientExceptionが発生しました:");
            System.out.println("エラーメッセージ: " + ce.getMessage());
        } finally {
            ossClient.shutdown();
        }
    }
}

X File Storageの導入

X File Storageは多様なクラウドストレージを簡単に管理することができるライブラリです。

依存関係の追加

<dependency>
    <groupId>org.dromara.x-file-storage</groupId>
    <artifactId>x-file-storage-spring</artifactId>
    <version>2.2.1</version>
</dependency>

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.16.1</version>
</dependency>

設定ファイルの編集

dromara:
  x-file-storage:
    default-platform: aliyun-oss-1
    thumbnail-suffix: ".min.jpg"
    aliyun-oss:
      - platform: aliyun-oss-1
        enable-storage: true
        access-key: ${ALI_OSS_KEY_ID}
        secret-key: ${ALI_OSS_KEY_SECRET}
        end-point: https://oss-cn-beijing.aliyuncs.com
        bucket-name: demosystem-file
        domain: https://demosystem-file.oss-cn-beijing.aliyuncs.com/
        base-path: images/

画像アップロード機能の実装

バックエンドのコード変更

以下のコードをRuoYiAdminControllerに追加します。

@Autowired
private FileStorageService fileStorageService;

@PostMapping("/upload")
public AjaxResult uploadFile(MultipartFile file) throws Exception {
    try {
        String objectName = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd")) + "/";
        FileInfo fileInfo = fileStorageService.of(file)
                .setPath(objectName)
                .upload();
        AjaxResult ajax = AjaxResult.success();
        ajax.put("url", fileInfo.getUrl());
        ajax.put("fileName", fileInfo.getUrl());
        ajax.put("newFileName", fileInfo.getUrl());
        ajax.put("originalFilename", file.getOriginalFilename());
        return ajax;
    } catch (Exception e) {
        return AjaxResult.error(e.getMessage());
    }
}

フロントエンドのコード変更

画像アップロードコンポーネントを以下の内容で変更します。

<el-form-item label="企業ロゴ" prop="enterpriseLogo">
    <image-upload 
        v-model="form.enterpriseLogo"
        :limit="1" 
        :on-remove="handleRemoveLogo" 
        :on-success="handleUploadSuccessLogo"
        :before-upload="beforeAvatarUpload"
    />
</el-form-item>

スクリプト部分を以下の内容で変更します。

const handleRemoveLogo = (file, fileList) => {
    form.enterpriseLogo = '';
}

const handleUploadSuccessLogo = async (file, fileList) => {
    try{
        const formData = new FormData();
        formData.append('file', file);
        const response = await axios.post('/common/upload', formData, {
            headers: {
                'Content-Type': 'multipart/form-data',
                ...this.upload.headers
            }
        });
        form.enterpriseLogo = response.data.url;
    }catch{
        ElMessage.error('アップロードに失敗しました、後ほどお試しください')
    }
}

const beforeAvatarUpload = (file) => {
    const isJPG = file.type === 'image/jpeg';
    const isLt2M = file.size / 1024 / 1024 < 2;
    if (!isJPG) {
        ElMessage.error('JPG形式のみアップロード可能です!');
    }
    if (!isLt2M) {
        ElMessage.error('2MB以下のファイルのみアップロード可能です!');
    }
    return isJPG && isLt2M;
}

タグ: Aliyun OSS RuoYi Java Spring Boot vue.js

5月17日 15:10 投稿