uniapp 请求后台文件,后台设置HttpServletResponse 的header 为Content-Disposition:attachment;filename=1685698197979.jpg,Content-Type:application/octet-stream; charset=UTF-8,我在前端怎么接收这个图片并展示
时间: 2024-03-03 09:48:02 浏览: 20
你可以通过ajax请求后端接口,获取到图片数据后,将其转化为一个Blob对象,然后使用URL.createObjectURL方法将Blob对象转化为一个URL地址,最后将这个URL地址赋值给img元素的src属性即可展示这张图片。以下是示例代码:
```js
// 发送ajax请求,获取图片数据
uni.request({
url: 'your-backend-api-url',
responseType: 'arraybuffer', // 指定返回的数据类型为二进制流
success(res) {
// 将二进制流转化为Blob对象
const blob = new Blob([res.data], { type: 'application/octet-stream' })
// 将Blob对象转化为URL地址
const imgUrl = URL.createObjectURL(blob)
// 将URL地址赋值给img元素的src属性
document.querySelector('#img').src = imgUrl
}
})
```
其中,#img是展示图片的img元素的选择器。注意,使用完URL.createObjectURL方法后,应该调用URL.revokeObjectURL方法来释放URL地址,避免内存泄漏。
相关问题
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置ContentType字段值 response.setContentType("text/html;charset=utf-8"); //获取所要下载的文件名称 String filename = request.getParameter("filename"); //下载文件所在目录 // 通知浏览器以下载的方式打开 response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition","attachment;filename="+filename); // 通过文件流读取文件 String path=request.getSession().getServletContext().getRealPath("/file/"+filename); System.out.println(path); InputStream in = new FileInputStream(path); String save="E:/download/" +filename; Path path1= Paths.get(save); Files.copy(in,path1); // 获取response对象的输出流 OutputStream out = response.getOutputStream(); Files.copy(path1,out); out.flush(); // byte[] buffer = new byte[1024]; // int len; // //循环取出流中的数据 // while ((len = in.read(buffer)) != -1) { // out.write(buffer, 0, len); // } // out.close(); // in.close(); }修改代码实现文件下载
以下是修改后的代码,实现了文件下载:
```java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置ContentType字段值
response.setContentType("text/html;charset=utf-8");
//获取所要下载的文件名称
String filename = request.getParameter("filename");
//下载文件所在目录
String filePath = request.getServletContext().getRealPath("/file/" + filename);
File downloadFile = new File(filePath);
//判断文件是否存在
if (downloadFile.exists()) {
//设置响应头,告诉浏览器是下载文件
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
//将文件从服务器读取到内存中,再写入到响应流中
FileInputStream in = new FileInputStream(downloadFile);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
in.close();
out.close();
} else {
//文件不存在,返回404状态码
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
```
这里使用了`doGet`方法,因为文件下载一般是通过GET请求实现的。另外,代码中还做了文件存在性的判断,如果文件不存在,则返回404状态码。
public void download(HttpServletResponse response) throws IOException { String[] filePath = new String[]{"D:\\ykds\\1aa.jpg", "D:\\ykds\\2aa.jpg", "D:\\ykds\\3aa.jpg"}; List<File> fileList = new ArrayList<>(); for (String s : filePath) { File file = new File(s); fileList.add(file); } response.setHeader("content-type", "application/octet-stream"); response.setContentType("application/octet-stream"); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=download.zip"); ZipUtils.downloadZip(response.getOutputStream(), fileList); }我怎么将String[]中的死值写成我另外一个实体中的值
你可以通过读取实体中的值来替换掉硬编码的文件路径,例如:
public void download(HttpServletResponse response, YourEntity entity) throws IOException {
String[] filePath = new String[]{entity.getPath1(), entity.getPath2(), entity.getPath3()};
List<File> fileList = new ArrayList<>();
for (String s : filePath) {
File file = new File(s);
fileList.add(file);
}
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=download.zip");
ZipUtils.downloadZip(response.getOutputStream(), fileList);
}
这样,你就可以调用 download 方法并传入一个实体对象,其中包含需要下载的文件路径。