文件上传修改文件名

本文介绍了如何使用Spring的MultipartFile实现文件上传,通过创建临时文件、重命名并转换为MultipartFile,最终借助阿里云OSS服务上传到指定目录。重点在于处理文件名的修改和上传流程的简化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用OSS服务,上传文件后修改文件名

使用MultipartFile实现文件上传功能,并修改文件名。
思路:将MultipartFile转化为IO文件流,重命名之后再转化为MultipartFile

public JsonResult uploadImg(MultipartFile img){
       String[] filename = img.getOriginalFilename().split("\\.");
       try{
       		//创建临时文件
       		File fileName = File.createTempFile(filename[0] + "temporary","." + filename[1]);
       		img.transferTo(fileName);
       		//设置文件名,这里使用当前时间毫秒数为文件名
       		String name = System.currentTimeMillis();
       		fileName = FileUtil.rename(fileName , name , true , true);
       		InputStream inputStream = new FileInputStream(fileName);
       		img = new MockMultipartFile(fileName.getName(),fileName.getName(),"image/png",inputStream);
       } catch (IOException e){
           e.printStackTrace();
       }
       //调用oss服务,上传至demo文件夹下
       JsonResult jsonResult = ossInterface.uploadossfile(img,"demo");
       return jsonResult;
<think>嗯,用户想了解如何在用JavaScript上传文件时修改文件名。我需要先回忆一下相关的知识。首先,文件上传通常是通过input标签的file类型实现的,用户选择文件后,可以通过JavaScript获取File对象。然后,在发送到服务器之前,可能需要修改文件名。我记得File对象本身是只读的,不能直接修改文件名。那怎么办呢?可能需要创建一个新的File对象,用新的文件名,同时保持数据和类型不变。比如使用new File([blob],newName,{type: originalFile.type})这样的方法。 然后,在构造FormData的时候,把新的File对象添加进去。这样上传到服务器的时候,文件名就是修改后的了。不过要注意,服务器端也需要处理这个修改后的文件名,比如保存到正确的位置或者数据库里。另外,用户可能需要一个完整的示例,包括前端JavaScript和后端PHP的处理。前端部分应该包括选择文件、修改文件名、分块上传或者直接上传。后端部分需要接收文件并保存,使用修改后的文件名。可能还需要考虑兼容性问题,比如IE不支持File构造函数,但现代浏览器应该没问题。用户可能没有提到兼容性,所以示例可以基于现代浏览器。还要注意,如果用户需要在上传时显示修改后的文件名,或者处理多个文件的情况,但根据问题描述,可能只需要单个文件的上传示例。然后,根据引用内容,用户之前的问题可能涉及分片上传,但这次的重点是修改文件名。所以示例代码应该突出如何修改文件名,而不是分片。不过可以提到分片上传的情况,如果需要的话。最后,生成的相关问题应该围绕这个主题,比如如何保留扩展名、多文件处理、安全注意事项,以及如何在后端处理修改后的文件名。这样用户可以有进一步了解的途径。</think>### JavaScript文件上传修改文件名示例 #### 1. 基础实现步骤 1. 通过`<input type="file">`获取文件对象 2. 使用`File`构造函数创建新文件名 3. 通过`FormData`发送修改后的文件 ```html <!-- HTML部分 --> <input type="file" id="fileInput" onchange="handleFile()"> ``` ```javascript // JavaScript部分 function handleFile() { const fileInput = document.getElementById('fileInput'); const originalFile = fileInput.files[0]; // 创建新文件名(保留扩展名) const newName = 'modified_file' + getFileExtension(originalFile.name); // 构建新File对象(数据不变) const modifiedFile = new File([originalFile], newName, { type: originalFile.type }); // 上传文件 const formData = new FormData(); formData.append('file', modifiedFile, newName); // 第三个参数显式设置文件名 // 发送到服务器(示例使用fetch API) fetch('/upload.php', { method: 'POST', body: formData }); } // 辅助函数:获取文件扩展名 function getFileExtension(filename) { return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); } ``` #### 2. 服务器端处理示例(PHP) ```php // upload.php $uploadDir = 'uploads/'; $uploadedFile = $_FILES['file']; // 获取客户端修改后的文件名 $clientFilename = basename($uploadedFile['name']); // 安全处理:过滤特殊字符 $safeFilename = preg_replace("/[^a-zA-Z0-9\._-]/", "", $clientFilename); // 最终保存路径 $targetPath = $uploadDir . $safeFilename; if (move_uploaded_file($uploadedFile['tmp_name'], $targetPath)) { echo "文件上传成功,保存为: " . $safeFilename; } else { http_response_code(500); echo "文件上传失败"; } ``` #### 3. 关键点说明 1. **文件名保留逻辑**:通过`getFileExtension`函数保留原始文件扩展名,避免破坏文件类型识别[^1] 2. **安全处理**:服务器端对文件名进行过滤,防止路径遍历攻击[^3] 3. **数据完整性**:新`File`对象使用原始文件的二进制数据,确保内容不变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈慌拥啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值