网站搜索

javascript - React 图片:createObjectURL 链接返回错误 404(未找到)


我在使用 React 和 TypeScript 的以下代码创建了一个 ImageUrl。它生成了一个 URL,但不显示图片。点击该 URL,例如 "http://localhost:3003/0b4de100-d8eb-49a7-b43a-e2147310abbe" 会出现以下错误。我该如何修复这个问题?

错误:

http://localhost:3003/0b4de100-d8eb-49a7-b43a-e2147310abbe 加载资源失败:服务器响应状态为 404(未找到)

代码:

 const [photoURL, setPhotoUrl] = useState<string>('');

 const pictureData = await getPatientAvatar(patientId);
 const blob = new Blob([pictureData], { type: 'image/jpeg' });
 const imageUrl = URL.createObjectURL(blob);
 setPhotoUrl(imageUrl);

 <img src={photoUrl} />

网络标签中的图片:

答案#1

通过调用 URL.createObjectURL() 创建的 URL 是一个 blob URL,其协议始终是 blob:。

你在问题中展示的 URL 并不是使用该方法创建的 blob URL,因为它的协议是 http:。

我在下面的代码片段中包含了一个可运行的示例。它将从图像 blob 数据创建一个对象 URL,然后将该 URL 作为字符串呈现,同时也用它作为渲染实际图像的源。你可以使用这段代码作为模型来重现成功。

<style>.avatar { height: 150px; width: 150px; }</style>
<div id="root"></div><script src="https://cdn.jsdelivr.net/npm/[email /umd/react.development.js"></script><script src="https://cdn.jsdelivr.net/npm/[email /umd/react-dom.development.js"></script><script src="https://cdn.jsdelivr.net/npm/@babel/[email /babel.min.js"></script><script>Babel.registerPreset('tsx', {presets: [[Babel.availablePresets['typescript'], {allExtensions: true, isTSX: true}]]});</script>
<script type="text/babel" data-type="module" data-presets="tsx,react">

// This Stack Overflow snippet uses UMD modules
const {StrictMode, useEffect, useState} = React;

// Since the Stack Overflow code snippet doesn't have access to your server,
// here is a function for fetching your example image data as a blob
async function fetchImageBlob (): Promise<Blob> {
  const response = await fetch('https://i.imgur.com/uSvshvJ.jpg');
  if (!response.ok) throw new Error('Response not OK');
  return response.blob();
}

function App (): React.ReactElement {
  const [objUrl, setObjUrl] = useState<string | undefined>();
  
  useEffect(() => void (async () => {
    if (objUrl) return;
    const blob = await fetchImageBlob();
    const oUrl = URL.createObjectURL(blob);
    setObjUrl(oUrl);
  })(), [objUrl]);

  return objUrl
    ? (
      <div>
        <pre><code>{objUrl}</code></pre>
        <img className="avatar" src={objUrl}></img>
      </div>
    )
    : (<div>Loading image...</div>);
}

const reactRoot = ReactDOM.createRoot(document.getElementById('root')!);

reactRoot.render(
  <StrictMode>
    <App />
  </StrictMode>
);

</script>

在 TypeScript 游乐场编写代码