在前端修改传给java后端的图片名称的代码实现
时间: 2024-03-05 16:54:24 浏览: 81
在前端修改传给 Java 后端的图片名称,您可以使用 `FormData` 对象来发送文件和其对应的名称到服务器端。以下是一种可能的实现方式:
HTML 代码:
```html
<input type="file" id="file-input" multiple>
<input type="text" id="filename-input" placeholder="请输入文件名">
<button id="upload-btn">上传文件</button>
```
JavaScript 代码:
```javascript
const fileInput = document.getElementById('file-input');
const filenameInput = document.getElementById('filename-input');
const uploadBtn = document.getElementById('upload-btn');
uploadBtn.addEventListener('click', () => {
const files = fileInput.files;
const filenames = filenameInput.value.split(',');
if (files.length !== filenames.length) {
alert('请选择相应数量的文件名');
return;
}
const formData = new FormData();
for (let i = 0; i < files.length; i++) {
formData.append('files[]', files[i], filenames[i]);
}
fetch('/upload', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error(error);
});
});
```
在这个例子中,我们使用 `FormData` 对象将文件和文件名打包到一个表单数据对象中,并将其发送到服务器端。需要注意的是,这种方式仍然存在安全风险,并且容易被攻击者利用。因此,最好的做法是在服务器端生成文件名,并将其返回给客户端。客户端可以在上传文件时将文件名传递给服务器,但是它不应该允许用户在前端修改文件名。
在 Java 后端中,您可以使用 Apache 的 Commons FileUpload 库来解析上传的文件和文件名。以下是一种可能的实现方式:
```java
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class UploadServlet extends HttpServlet {
private static final String UPLOAD_DIRECTORY = "uploads";
private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB
private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 检查请求是否为 multipart/form-data
if (!ServletFileUpload.isMultipartContent(request)) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "请求不是 multipart/form-data 类型");
return;
}
// 配置上传参数
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(MEMORY_THRESHOLD);
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload uploader = new ServletFileUpload(factory);
uploader.setFileSizeMax(MAX_FILE_SIZE);
uploader.setSizeMax(MAX_REQUEST_SIZE);
// 解析上传的文件
try {
List<FileItem> items = uploader.parseRequest(request);
for (FileItem item : items) {
// 如果当前项是一个上传的文件,则保存到磁盘上
if (!item.isFormField()) {
String fileName = item.getName();
// 在这里可以将文件名进行修改
File uploadDir = new File(getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
File uploadFile = new File(uploadDir + File.separator + fileName);
item.write(uploadFile);
}
}
// 返回上传成功的信息
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("{\"success\": true}");
} catch (Exception e) {
// 返回上传失败的信息
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("{\"success\": false}");
}
}
}
```
在这个例子中,我们使用 Commons FileUpload 库来解析上传的文件和文件名。当上传一个文件时,我们可以在 `FileItem` 对象上使用 `getName()` 方法来获取文件名,并在这里修改文件名。在这个例子中,我们将上传的文件保存到一个名为 `uploads` 的文件夹中。需要注意的是,这种方式仍然存在安全风险,并且容易被攻击者利用。因此,最好的做法是在服务器端生成文件名,并将其返回给客户端。客户端可以在上传文件时将文件名传递给服务器,但是它不应该允许用户在前端修改文件名。
阅读全文