最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java后端調(diào)用第三方接口返回圖片流給前端的具體代碼實(shí)現(xiàn)

 更新時(shí)間:2024年02月13日 10:17:35   作者:Monameng  
在前后端分離的開(kāi)發(fā)中,經(jīng)常會(huì)遇到需要從后端返回圖片流給前端的情況,下面這篇文章主要給大家介紹了關(guān)于java后端調(diào)用第三方接口返回圖片流給前端的具體代碼實(shí)現(xiàn),需要的朋友可以參考下

一、背景

有個(gè)需求是這樣的,客戶端直接通過(guò)外網(wǎng)訪問(wèn)oss獲取圖片需要額外付費(fèi),考慮到成本問(wèn)題,修改技術(shù)方案為:客戶端將請(qǐng)求鏈接發(fā)給后端,后端根據(jù)請(qǐng)求做一定的截取或拼接,通過(guò)內(nèi)網(wǎng)調(diào)用oss,再將下載下來(lái)的圖片流返回給前端。

圖片流,展現(xiàn)在頁(yè)面上就是直接返回一張圖片在瀏覽器上。

二、具體代碼展示 

前端期望,如果異常,直接把http status返回非200

@Slf4j
@RestController
public class PictureController {
    @Autowired
    private PictureService pictureService;

    @RequestMapping(value = "getPicture")
    public void getPicture(String path, HttpServletResponse resp) {
        boolean picSuccess;
        // 注意:一定要有這步,否則圖片顯示不出來(lái)
        resp.setContentType(MediaType.IMAGE_JPEG_VALUE);
        long start = System.currentTimeMillis();
        try {
            picSuccess = pictureService.getOssPicture(path, resp);
            if (!picSuccess) {
                resp.setStatus(HttpServletResponse.SC_FORBIDDEN);
            }
        } catch (Exception e) {
            resp.setStatus(HttpServletResponse.SC_FORBIDDEN);
            log.error("下載圖片失?。?!");
        }
        log.info("cmd=/getPicture,param={},cost:{}", path, System.currentTimeMillis() - start);
    }
}
public interface PictureService {
    boolean getOssPicture(String path, HttpServletResponse resp) throws IOException;
}
@Slf4j
@Service
public class PictureServiceImpl implements PictureService {
    
    @Value("${alioss.ak}")
    private String accessKeyId;

    // http://*********.aliyuncs.com
    @Value("${url.prefix}")
    private String urlPrefix;

    @Value("${oss.connect.time:3000}")
    private int ossConnectTime;

    @Override
    public boolean getOssPicture(String path, HttpServletResponse resp) throws IOException {
        String url = getOssUrl(path);
        long st = System.currentTimeMillis();
        Request requestDownload = new Request.Builder()
                .url(url)
                .build();
        OkHttpClient client = new OkHttpClient();
        client = client.newBuilder().connectTimeout(ossConnectTime, TimeUnit.MILLISECONDS).build();
        Response responseDownload = client.newCall(requestDownload).execute();
        if (responseDownload.isSuccessful() && responseDownload.body() != null && responseDownload.body().byteStream() != null) {
            InputStream is = responseDownload.body().byteStream();
            writeImageFile(resp, is);
        } else {
            log.error("PictureServiceImpl-oss調(diào)用返回異常: url={}, data={}", url, responseDownload);
            return false;
        }
        long responseTime = System.currentTimeMillis() - st;
        log.info("request-oss cost:{}", responseTime);
        return true;
    }

    // base64解碼==這塊是與前端約定好的,我這邊要做的解碼
    private String getOssUrl(String path) throws UnsupportedEncodingException {
        final Base64.Decoder decoder = Base64.getDecoder();
        String decodePath = new String(decoder.decode(path), "UTF-8");
        StringBuffer buffer = new StringBuffer();
        String[] split = decodePath.split("&");
        for (int i = 0; i < split.length; i++) {
            if (!split[i].startsWith("Version")) {
                buffer.append(split[i]).append("&");
            }
        }
        log.info("getOssUrl={}", urlPrefix + buffer);
        buffer.append("OSSAccessKeyId=").append(accessKeyId);
        return urlPrefix + buffer;
    }

    /**
     * 將輸入流輸出到頁(yè)面
     *
     * @param resp
     * @param inputStream
     */
    public void writeImageFile(HttpServletResponse resp, InputStream inputStream) {
        OutputStream out = null;
        try {
            out = resp.getOutputStream();
            int len = 0;
            byte[] b = new byte[1024];
            while ((len = inputStream.read(b)) != -1) {
                out.write(b, 0, len);
            }
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

三、總結(jié)

上面就是返回圖片流的方式;

補(bǔ)充:Java后端實(shí)現(xiàn)圖片上傳并返回文件流

/**
 * @ClassName:
 * @User: ljh
 * @Date: 2022/12/19 15:01
 */
@RestController
public class IoController {

    @GetMapping("/download")
    public void download(@RequestParam("file") MultipartFile file,
                         HttpServletResponse response) throws Exception {
        String path = "E://";
        String filename = URLEncoder.encode("test.png", "UTF-8");
        response.setContentType("application/x-download");
        response.setHeader("Content-Disposition", "attachment;filename=" + filename);//瀏覽器上提示下載時(shí)默認(rèn)的文件名
        ServletOutputStream out = response.getOutputStream();
        InputStream stream = file.getInputStream();

        try {//讀取服務(wù)器上的文件
            byte buff[] = new byte[file.getBytes().length];
            int length = 0;
            while ((length = stream.read(buff)) > 0) {
                out.write(buff, 0, length);
            }

            File newFile =new File(path + filename);
            file.transferTo(newFile);

            stream.close();
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

到此這篇關(guān)于java后端調(diào)用第三方接口返回圖片流給前端的具體代碼實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)java后端返回圖片流給前端內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot 配置文件(application.yml、application-dev.yml、application-test.yml)

    Spring Boot 配置文件(application.yml、application-dev.y

    本文主要介紹了Spring Boot 配置文件,主要包含application.yml、application-dev.yml、application-test.yml,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Java中連接數(shù)據(jù)庫(kù)方式詳細(xì)步驟記錄

    Java中連接數(shù)據(jù)庫(kù)方式詳細(xì)步驟記錄

    這篇文章主要介紹了Java中連接數(shù)據(jù)庫(kù)方式的詳細(xì)步驟,包括添加依賴、建立連接、執(zhí)行SQL語(yǔ)句、處理結(jié)果集和關(guān)閉連接,還討論了數(shù)據(jù)庫(kù)連接池的使用,需要的朋友可以參考下
    2025-01-01
  • MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)類型和Java類型轉(zhuǎn)換的處理方法

    MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)類型和Java類型轉(zhuǎn)換的處理方法

    MyBatis作為一個(gè)優(yōu)秀的持久層框架,其核心功能之一就是處理Java類型和數(shù)據(jù)庫(kù)類型之間的轉(zhuǎn)換,這種轉(zhuǎn)換過(guò)程在MyBatis中被稱為"類型處理器(TypeHandler)"機(jī)制,本文給大家詳細(xì)介紹了MyBatis如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)類型和Java類型的轉(zhuǎn)換,需要的朋友可以參考下
    2025-05-05
  • 一篇文章詳解JAVA中的@Schema注解

    一篇文章詳解JAVA中的@Schema注解

    @Schema注解用于描述數(shù)據(jù)模型,包括類和屬性,使得描述更加的詳細(xì)和清楚,通常和swagger3一起使用,這篇文章主要介紹了JAVA中@Schema注解的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Idea中指定xml文件失效的解決過(guò)程

    Idea中指定xml文件失效的解決過(guò)程

    最近在開(kāi)發(fā)的過(guò)程中遇到了一個(gè)奇怪的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Idea中指定xml文件失效的解決過(guò)程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • 你真的了解Java的多線程方法嗎

    你真的了解Java的多線程方法嗎

    這篇文章主要為大家詳細(xì)介紹了Java的多線程方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • IDEA導(dǎo)出暫存區(qū)(Shelf)的代碼的完整過(guò)程

    IDEA導(dǎo)出暫存區(qū)(Shelf)的代碼的完整過(guò)程

    IDEA 有一個(gè)很好用的功能,Shelve Changes...,可以將代碼暫時(shí)存起來(lái),方便切換分支,或暫存代碼,先處理其他事情,本文就給大家介紹如何將暫存區(qū)的代碼,導(dǎo)出來(lái),導(dǎo)入到另一個(gè)項(xiàng)目或者另一臺(tái)電腦上,需要的朋友可以參考下
    2025-10-10
  • 并發(fā)編程之Java內(nèi)存模型volatile的內(nèi)存語(yǔ)義

    并發(fā)編程之Java內(nèi)存模型volatile的內(nèi)存語(yǔ)義

    這篇文章主要介紹了并發(fā)編程之Java內(nèi)存模型volatile的內(nèi)存語(yǔ)義,理解volatile特性的一個(gè)好辦法是把對(duì)volatile變量的單個(gè)讀/寫(xiě),看成是使用同一個(gè)鎖對(duì)單個(gè)讀/寫(xiě)操作做了同步。下面我們一起進(jìn)入文章看看具體例子吧,需要的小伙伴可以參考下
    2021-11-11
  • Java過(guò)濾XSS腳本攻擊詳細(xì)代碼示例

    Java過(guò)濾XSS腳本攻擊詳細(xì)代碼示例

    這篇文章主要介紹了Java過(guò)濾XSS腳本攻擊的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java如何使用while循環(huán)計(jì)算一個(gè)整數(shù)的位數(shù)

    Java如何使用while循環(huán)計(jì)算一個(gè)整數(shù)的位數(shù)

    這篇文章主要介紹了Java使用while循環(huán)計(jì)算一個(gè)整數(shù)的位數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論

宜黄县| 抚松县| 兴山县| 古浪县| 祁东县| 乐安县| 历史| 荆州市| 黔江区| 柘城县| 库尔勒市| 峨边| 凯里市| 太保市| 通许县| 玉山县| 墨脱县| 女性| 漠河县| 城口县| 元氏县| 高唐县| 册亨县| 拉孜县| 金坛市| 浦东新区| 贵阳市| 东兴市| 盈江县| 略阳县| 台前县| 马山县| 邯郸县| 益阳市| 光泽县| 上林县| 东乌| 广昌县| 尼玛县| 西充县| 罗源县|