接口访问服务端文件(流文件)

新增 Controller 

package org.wq.study.javastudyserver.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

@Slf4j
@Tag(name = "文件", description = "文件注解")
@RestController
public class FileController {

    @Operation(summary = "获取文件")
    @GetMapping("/get/file")
    public void getFile(HttpServletResponse response) throws ServletException, IOException {
        String filePath = "F:\\Users\\Administrator\\Desktop\\下载\\test.ttf";
        response.setHeader("Content-Disposition", "attachment; filename=test.ttf");
        response.setContentType("application/octet-stream");

        try (InputStream inputStream = new FileInputStream(filePath);
             OutputStream outputStream = response.getOutputStream()) {
            byte[] buffer = new byte[4096];
            int byteRead;
            while ((byteRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, byteRead);
            }
        }
    }
}

PS:HttpServletResponse 需要引入 jakarta 里的 !!

访问 http://localhost:8080/get/file 可直接获取文件流下载文件

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Rust中实现一个文件下载接口,从服务端数据库下载文件到本地,你可以使用Rust的web框架(例如Rocket或Actix-web)来创建HTTP服务器,并使用Rust的数据库库(例如Diesel或sqlx)与数据库进行交互。下面是一个基本的示例: 1. 首先,你需要在你的项目中添加所需的依赖。可以在你的Cargo.toml文件中添加以下内容: ```toml [dependencies] actix-web = "3.3" sqlx = { version = "0.5", features = ["runtime-actix"] } ``` 2. 创建一个main.rs文件,并导入所需的模块: ```rust use actix_web::{get, web, App, HttpResponse, HttpServer, Responder}; use sqlx::postgres::PgPool; #[get("/{file_id}")] async fn download_file( db_pool: web::Data<PgPool>, web::Path(file_id): web::Path<u32>, ) -> impl Responder { // 从数据库中获取文件信息 let file_info = get_file_info_from_database(&db_pool, file_id).await; // 检查文件信息是否存在 if let Some(file_info) = file_info { // 下载文件到本地 let result = download_file_to_local(&file_info.url, &file_info.filename).await; // 检查文件下载是否成功 if result.is_ok() { return HttpResponse::Ok().body(format!("File downloaded successfully: {}", file_info.filename)); } } HttpResponse::NotFound().body("File not found") } async fn get_file_info_from_database( db_pool: &PgPool, file_id: u32, ) -> Option<FileInfo> { // 查询数据库获取文件信息 let file_info = sqlx::query_as!( FileInfo, r#" SELECT url, filename FROM files WHERE id = $1 "#, file_id ) .fetch_optional(db_pool) .await .ok()? .flatten(); file_info } async fn download_file_to_local(url: &str, filename: &str) -> Result<(), reqwest::Error> { // 发起 HTTP 请求下载文件 let response = reqwest::get(url).await?; // 创建文件并将文件内容写入磁盘 let mut file = tokio::fs::File::create(filename).await?; let content = response.bytes().await?; tokio::io::AsyncWriteExt::write_all(&mut file, &content).await?; Ok(()) } #[derive(sqlx::FromRow)] struct FileInfo { url: String, filename: String, } #[actix_web::main] async fn main() -> std::io::Result<()> { // 初始化数据库连接池 let db_pool = PgPool::connect("your_database_url").await.unwrap(); // 启动HTTP服务器 HttpServer::new(move || { App::new() .data(db_pool.clone()) .service(download_file) }) .bind("127.0.0.1:8080")? .run() .await } ``` 在上述示例代码中,我们使用了Actix-web作为HTTP服务器框架,sqlx库用于与PostgreSQL数据库交互,reqwest库用于发起HTTP请求并下载文件。 请确保将`your_database_url`替换为你的实际数据库连接URL,并根据你的数据库模式和表结构调整查询语句。 你可以通过访问`http://localhost:8080/{file_id}`来下载文件,其中`{file_id}`是要下载的文件的ID。如果文件存在并成功下载到本地,将返回一个成功的HTTP响应,否则返回一个404 Not Found响应。 这只是一个简单的示例,你可以根据实际需求进行进一步的优化和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值