java后端解析文件返回文件流,前端自定义文件名

java后端解析文件返回文件流,前端自定义文件名

请求属性:responseType: ‘blob’

后台代码示例


```java
public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map,
			String fileName, String ftlName) throws IOException {
		File file = null;
		InputStream fin = null;
		ServletOutputStream out = null;
		file = createDoc(map, ftlName, fileName);
		if (response != null) {
			response.reset();
		}
		if (file.exists()) {
			try {
				fin = new FileInputStream(file);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			// 文档下载
			response.setCharacterEncoding("utf-8");
			//response.setContentType("application/x-msdownload");
			try {
				fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
			} catch (UnsupportedEncodingException e1) {
				e1.printStackTrace();
			}
			response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
			response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8") + ".doc");
			try {
				out = response.getOutputStream();
			} catch (IOException e) {
				e.printStackTrace();
			}
			byte[] buffer = new byte[512]; // 缓冲区
			int bytesToRead = -1;
			// 通过循环将读入的Word文件的内容输出到浏览器中
			try {
				while ((bytesToRead = fin.read(buffer)) != -1) {
					out.write(buffer, 0, bytesToRead);
				}
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (fin != null)
					try {
						fin.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				if (out != null)
					try {
						out.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				if (file != null)
					file.delete(); // 删除临时文件
			}
        }
	}

## 前端代码实例

```javascript
creatWord() {
				this.timeStr = this.dateStr(new Date(),'-');
				creatWord().then((res) => {
					if(!res) {
						return;
					}
					let blob = new Blob([res.data], {
						type: "application/msword"
					});
					let url = window.URL.createObjectURL(blob)
					let link = document.createElement('a')
					link.download = '申报书打印版'+this.timeStr+'.doc'
					link.style.display = 'none'
					link.href = url
					document.body.appendChild(link)
					link.click()
				})
			},
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 后端可以通过使用对象来完成向前端写入文件的操作。具体步骤如下: 1. 声明输入和输出对象,输入用于读取文件内容,输出用于将文件内容写入前端。 2. 使用文件读取 API 读取本地文件内容,并将读取到的内容写入输出。 3. 将输出对象中的字节数组返回前端前端通过解析字节数组即可获取文件。 例如,以下代码演示了如何向前端返回一个本地文件文件: ``` @RequestMapping(value = "/download", method = RequestMethod.GET) public ResponseEntity<byte[]> downloadFile() throws IOException { String filePath = "/path/to/file.txt"; File file = new File(filePath); byte[] fileContent = Files.readAllBytes(file.toPath()); // 读取文件内容 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", file.getName()); // 设置文件名 headers.setContentLength(fileContent.length); // 设置文件长度 return new ResponseEntity<>(fileContent, headers, HttpStatus.OK); // 将文件返回前端 } ``` 在上述代码中,我们首先通过传入的文件路径构造一个文件对象,然后使用 Java 标准库中的 `Files` 类读取文件内容并将其转换为字节数组。接着,我们设置了文件的 MIME 类型、下载时的文件名文件长度等元信息,最后使用 `ResponseEntity` 将文件字节数组作为响应体返回前端前端在接收到响应后,会根据 `Content-Type` 头部解析文件,并在页面上展示、下载、保存等操作。 ### 回答2: 在Java后端,可以使用FileInputStream类和BufferedInputStream类来读取本地文件。首先,需要使用FileInputStream打开本地文件并创建对象,然后使用BufferedInputStream来提高读取效率,最后读取文件内容并放入byte数组中。 接下来,可以将读取的byte数组写入到OutputStream中,将其返回前端进行下载。此时,需要使用response对象设置Content-Disposition和Content-Type头信息,以确保文件能够被正确地下载。最后,需要使用flush方法将内容刷新到前端。 具体实现代码如下: ```java @RequestMapping("/downloadFile") public void downloadFile(HttpServletResponse response) { //设置文件路径 String filePath = "/path/to/file.txt"; File file = new File(filePath); FileInputStream fis = null; BufferedInputStream bis = null; OutputStream os = null; try { fis = new FileInputStream(file); bis = new BufferedInputStream(fis); byte[] buffer = new byte[fis.available()]; fis.read(buffer); response.reset(); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + file.getName()); os = response.getOutputStream(); os.write(buffer); os.flush(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (bis != null) { bis.close(); } if (fis != null) { fis.close(); } if (os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); } } } ``` 以上就是将Java后端写入返回前端文件的实现思路和代码。 ### 回答3: Java后端写入返回前端文件是一种常见的文件操作情景。该操作的主要目的是将后端生成或处理的文件传递给前端,让前端可以进行文件的下载或展示等操作。 Java后端写入通常使用IO的方式进行。IOJava中处理输入输出的重要组成部分,可以通过读写文件、网络等方式将数据传输到不同的设备或系统中。在Java中,常用的IO包括字节和字符两种类型。字节用于处理二进制数据,而字符用于处理文本数据。 在进行Java后端写入操作时,需要先将生成或处理的文件数据写入到输出(如FileOutputStream,OutputStreamWriter等对象)中。随后,可以通过字节或字符的方式将数据传输到前端。具体的传输方式取决于前端所支持的数据格式和传输方式。常见的文件传输方式包括HTTP协议、FTP协议等。 在前端接收到Java后端写入后,需要通过JavaScript等方式处理传输的数据。如果需要下载文件,可以使用FileSaver.js等JavaScript库实现文件的保存。如果需要展示文件,可以使用浏览器内置的文件预览功能或第三方JavaScript库进行展示。 总之,Java后端写入返回前端文件是一种较为常见的文件处理操作,需要对Java的IO前端文件传输方式有一定的了解。同时,在进行文件传输时需要考虑到文件大小、安全性、数据格式等方面的问题,以确保传输的可靠性和完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值