Springbootの実際の戦闘コードは写真をどのように正常に返すのですか?

Springbootの実際の戦闘コード:[写真を適切に返す方法]

この記事では、画像を返すための一般的な方法をまとめます。

  1. ストリーミングリターン:主に、応答とHttpConvertMessageに基づいて実装が異なるため
  2. base64が返す

解説

画像は多くの場所から取得でき、ローカルフォルダ、ネットワークストリーム、またはデータベースバイナリの場合もあります。ここでは、簡単にするために、ローカルファイルを使用しています。

@RestController
@RequestMapping("/")
public class ImgController {

    private String imgPath = "E:\\meme.png";

    private InputStream getImgInputStream() throws FileNotFoundException {
        return new FileInputStream(new File(imgPath));
    }

依存する

以下で使用するIOUtilsは、従来のcommon-ioモジュールから、誰もが知っているはずです

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

1.応答に基づいて戻る

非常に基本的で簡単な方法:

import org.apache.commons.io.IOUtils;
import org.springframework.http.MediaType;

    /**
     * 使用response输出图片流
     */
    @GetMapping("/img-response")
    public void getImage(HttpServletResponse resp) throws IOException {
        final InputStream in = getImgInputStream();
        resp.setContentType(MediaType.IMAGE_PNG_VALUE);
        IOUtils.copy(in, resp.getOutputStream());
    }

2.プロデューサーに基づいてバイトストリームを返す

2.1生のバイトストリームを返す

まず、バイトストリームが直接画像を返すとどうなるかを見てみましょう。

    /**
     * 试试直接返回字节流,不指定content-type
     */
    @GetMapping(value = "/img-byte")
    public byte[] getImageByte() throws IOException {
        final InputStream in = getImgInputStream();
        return IOUtils.toByteArray(in);
    }

結果は次のとおりです。コンテンツタイプが間違っているため、文字化けします。
img-response文字化け

2.2バイトストリームを返すコンテンツタイプを指定する

プロデューサーを使用してタイプを指定する:ここでは2つのタイプを指定し、何が起こるかを確認します

    @GetMapping(value = "/img-media-type",
            produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
    public byte[] getImage() throws IOException {
        final InputStream in = getImgInputStream();
        return IOUtils.toByteArray(in);
    }

写真は、正常な状態に戻ることができますが、よく見ると、レスポンスヘッダ内がcontent-typeあるimage/jpeg
img jpeg
、我々は要求をデフォルトのときに我々は、画像をPNGですが、第一種のJPEGと一致springbootので。

それでは、どのようにしてcontent-typeを返すようにしimage/pngますか?
ソースコードのコメントを読むことで、
作り出す
リクエストしたときに必要な場所を渡すだけでよいことがわかりAcceptます。次に、郵便配達員の例を示します。
画像png

実際、このメソッドは上記の/img-byteインターフェースでも使用でき、文字化けした文字は返されません。
img-byte
同時に、サポートされていないタイプを渡すと406、エラーが発生します。
406

2.3画像ファイルを直接ダウンロードする

ダウンロードボックスを直接ポップアップする場合は、content-typeを次のように指定できます。application/octet-stream

    @GetMapping(value = "/img-file.png", 
    	produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE})
    public byte[] getImageFile() throws IOException {
        final InputStream in = getImgInputStream();
        return IOUtils.toByteArray(in);
    }

シャザイ

    @GetMapping(value = "/img/{iconId}", produces = {MediaType.IMAGE_PNG_VALUE, MediaType.IMAGE_JPEG_VALUE})
    public byte[] getImage(@PathVariable String iconId) throws IOException {
        final GisIcon icon = iconService.getById(iconId);
        if (icon == null) {
            throw new IllegalArgumentException("不存在此图片");
        }
        final FileInputStream fio = new FileInputStream(new File(iconService.getSavePath(icon.getUsername(),
                icon.getName(), icon.getId())));
        byte[] bytes = new byte[fio.available()];
        log.info("读取文件结果:{}", fio.read(bytes, 0, fio.available()));
        return bytes;
    }

3. base64画像

import java.util.Base64;

    @GetMapping("/img-base64")
    public String getBase64Img() throws IOException {
        final byte[] bytes = IOUtils.toByteArray(getImgInputStream());
        return Base64.getEncoder().encodeToString(bytes);
    }

フロントエンド受付:

function reqListener (base64) {
  var body = document.getElementsByTagName("body");
  var img = document.createElement("img");
  img.src = "data:image/png;base64, "+base64;
  body.appendChild(img);
}

var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", "http://localhost:8013/img-base64");
oReq.send();
元の記事を80件公開しました 319のようです 訪問数340,000以上

おすすめ

転載: blog.csdn.net/jimo_lonely/article/details/105305522