vue+axios ,文件 上传, post formData,formData.append,文件名称有中文,后台servlet读取乱码,
时间: 2024-10-14 22:13:36 浏览: 48
Vue.js 和 Axios 结合可以方便地处理前端文件上传操作。当你需要通过 `axios.post` 发送包含文件的数据到后端服务器时,通常会使用 `FormData` 对象。`FormData.append()` 方法用于向 FormData 中添加键值对,其中文件作为值。
如果你遇到文件名包含中文的情况,发送前需要正确编码文件名,避免后端接收到乱码。在JavaScript中,可以使用 `encodeURIComponent()` 函数对文件名进行编码:
```javascript
let fileInput = document.querySelector('input[type="file"]');
let formData = new FormData();
let fileName = fileInput.files[0].name;
fileName = encodeURIComponent(fileName); // 对文件名进行编码
formData.append('file', fileInput.files[0], fileName);
```
然而,如果后端是Servlet,由于字符集设置的问题可能会导致乱码。你需要确保后端读取请求头中的 Content-Type,并且在解析文件名时设置了正确的字符集,例如UTF-8。在Servlet中,可以这样做:
```java
String contentType = request.getContentType();
if (contentType.startsWith("multipart/form-data")) {
String boundary = extractBoundary(contentType);
List<Part> parts = parseMultipartRequest(request.getParts(), boundary);
for (Part part : parts) {
if (part.getName().equals("file")) {
String fileName = getFileNameFrom(part.getSubmittedFileName());
// 将编码后的文件名解码为原名
fileName = URLDecoder.decode(fileName, "UTF-8");
... // 处理文件内容
}
}
}
private String getFileNameFrom(String originalFilename) {
int semiColonIndex = originalFilename.indexOf(';');
return semiColonIndex > -1 ? originalFilename.substring(0, semiColonIndex) : originalFilename;
}
```
阅读全文