feat:页面上传框优化

master
wanghao 3 weeks ago
parent 8033e0fef3
commit 3c9f8053da

@ -1,32 +1,26 @@
package com.ruoyi.common.utils.file; package com.ruoyi.common.utils.file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.common.utils.uuid.IdUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
/** /**
* *
* *
* @author ruoyi * @author ruoyi
*/ */
public class FileUtils public class FileUtils {
{
public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
/** /**
@ -36,30 +30,22 @@ public class FileUtils
* @param os * @param os
* @return * @return
*/ */
public static void writeBytes(String filePath, OutputStream os) throws IOException public static void writeBytes(String filePath, OutputStream os) throws IOException {
{
FileInputStream fis = null; FileInputStream fis = null;
try try {
{
File file = new File(filePath); File file = new File(filePath);
if (!file.exists()) if (!file.exists()) {
{
throw new FileNotFoundException(filePath); throw new FileNotFoundException(filePath);
} }
fis = new FileInputStream(file); fis = new FileInputStream(file);
byte[] b = new byte[1024]; byte[] b = new byte[1024];
int length; int length;
while ((length = fis.read(b)) > 0) while ((length = fis.read(b)) > 0) {
{
os.write(b, 0, length); os.write(b, 0, length);
} }
} } catch (IOException e) {
catch (IOException e)
{
throw e; throw e;
} } finally {
finally
{
IOUtils.close(os); IOUtils.close(os);
IOUtils.close(fis); IOUtils.close(fis);
} }
@ -72,8 +58,7 @@ public class FileUtils
* @return * @return
* @throws IOException IO * @throws IOException IO
*/ */
public static String writeImportBytes(byte[] data) throws IOException public static String writeImportBytes(byte[] data) throws IOException {
{
return writeBytes(data, RuoYiConfig.getImportPath()); return writeBytes(data, RuoYiConfig.getImportPath());
} }
@ -85,20 +70,16 @@ public class FileUtils
* @return * @return
* @throws IOException IO * @throws IOException IO
*/ */
public static String writeBytes(byte[] data, String uploadDir) throws IOException public static String writeBytes(byte[] data, String uploadDir) throws IOException {
{
FileOutputStream fos = null; FileOutputStream fos = null;
String pathName = ""; String pathName = "";
try try {
{
String extension = getFileExtendName(data); String extension = getFileExtendName(data);
pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;
File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName); File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName);
fos = new FileOutputStream(file); fos = new FileOutputStream(file);
fos.write(data); fos.write(data);
} } finally {
finally
{
IOUtils.close(fos); IOUtils.close(fos);
} }
return FileUploadUtils.getPathFileName(uploadDir, pathName); return FileUploadUtils.getPathFileName(uploadDir, pathName);
@ -110,8 +91,7 @@ public class FileUtils
* @param filePath * @param filePath
* @return * @return
*/ */
public static String stripPrefix(String filePath) public static String stripPrefix(String filePath) {
{
return StringUtils.substringAfter(filePath, Constants.RESOURCE_PREFIX); return StringUtils.substringAfter(filePath, Constants.RESOURCE_PREFIX);
} }
@ -121,13 +101,11 @@ public class FileUtils
* @param filePath * @param filePath
* @return * @return
*/ */
public static boolean deleteFile(String filePath) public static boolean deleteFile(String filePath) {
{
boolean flag = false; boolean flag = false;
File file = new File(filePath); File file = new File(filePath);
// 路径为文件且不为空则进行删除 // 路径为文件且不为空则进行删除
if (file.isFile() && file.exists()) if (file.isFile() && file.exists()) {
{
flag = file.delete(); flag = file.delete();
} }
return flag; return flag;
@ -139,8 +117,7 @@ public class FileUtils
* @param filename * @param filename
* @return true false * @return true false
*/ */
public static boolean isValidFilename(String filename) public static boolean isValidFilename(String filename) {
{
return filename.matches(FILENAME_PATTERN); return filename.matches(FILENAME_PATTERN);
} }
@ -150,17 +127,14 @@ public class FileUtils
* @param resource * @param resource
* @return true false * @return true false
*/ */
public static boolean checkAllowDownload(String resource) public static boolean checkAllowDownload(String resource) {
{
// 禁止目录上跳级别 // 禁止目录上跳级别
if (StringUtils.contains(resource, "..")) if (StringUtils.contains(resource, "..")) {
{
return false; return false;
} }
// 检查允许下载的文件规则 // 检查允许下载的文件规则
if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) {
{
return true; return true;
} }
@ -175,28 +149,20 @@ public class FileUtils
* @param fileName * @param fileName
* @return * @return
*/ */
public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException {
{
final String agent = request.getHeader("USER-AGENT"); final String agent = request.getHeader("USER-AGENT");
String filename = fileName; String filename = fileName;
if (agent.contains("MSIE")) if (agent.contains("MSIE")) {
{
// IE浏览器 // IE浏览器
filename = URLEncoder.encode(filename, "utf-8"); filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " "); filename = filename.replace("+", " ");
} } else if (agent.contains("Firefox")) {
else if (agent.contains("Firefox"))
{
// 火狐浏览器 // 火狐浏览器
filename = new String(fileName.getBytes(), "ISO8859-1"); filename = new String(fileName.getBytes(), "ISO8859-1");
} } else if (agent.contains("Chrome")) {
else if (agent.contains("Chrome"))
{
// google浏览器 // google浏览器
filename = URLEncoder.encode(filename, "utf-8"); filename = URLEncoder.encode(filename, "utf-8");
} } else {
else
{
// 其它浏览器 // 其它浏览器
filename = URLEncoder.encode(filename, "utf-8"); filename = URLEncoder.encode(filename, "utf-8");
} }
@ -210,8 +176,7 @@ public class FileUtils
* @param realFileName * @param realFileName
* @return * @return
*/ */
public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException {
{
String percentEncodedFileName = percentEncode(realFileName); String percentEncodedFileName = percentEncode(realFileName);
StringBuilder contentDispositionValue = new StringBuilder(); StringBuilder contentDispositionValue = new StringBuilder();
@ -231,8 +196,7 @@ public class FileUtils
* @param s * @param s
* @return * @return
*/ */
public static String percentEncode(String s) throws UnsupportedEncodingException public static String percentEncode(String s) throws UnsupportedEncodingException {
{
String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
return encode.replaceAll("\\+", "%20"); return encode.replaceAll("\\+", "%20");
} }
@ -243,24 +207,16 @@ public class FileUtils
* @param photoByte * @param photoByte
* @return * @return
*/ */
public static String getFileExtendName(byte[] photoByte) public static String getFileExtendName(byte[] photoByte) {
{
String strFileExtendName = "jpg"; String strFileExtendName = "jpg";
if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
&& ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) {
{
strFileExtendName = "gif"; strFileExtendName = "gif";
} } else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) {
else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70))
{
strFileExtendName = "jpg"; strFileExtendName = "jpg";
} } else if ((photoByte[0] == 66) && (photoByte[1] == 77)) {
else if ((photoByte[0] == 66) && (photoByte[1] == 77))
{
strFileExtendName = "bmp"; strFileExtendName = "bmp";
} } else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) {
else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71))
{
strFileExtendName = "png"; strFileExtendName = "png";
} }
return strFileExtendName; return strFileExtendName;
@ -272,10 +228,8 @@ public class FileUtils
* @param fileName * @param fileName
* @return * @return
*/ */
public static String getName(String fileName) public static String getName(String fileName) {
{ if (fileName == null) {
if (fileName == null)
{
return null; return null;
} }
int lastUnixPos = fileName.lastIndexOf('/'); int lastUnixPos = fileName.lastIndexOf('/');
@ -290,10 +244,8 @@ public class FileUtils
* @param fileName * @param fileName
* @return * @return
*/ */
public static String getNameNotSuffix(String fileName) public static String getNameNotSuffix(String fileName) {
{ if (fileName == null) {
if (fileName == null)
{
return null; return null;
} }
String baseName = FilenameUtils.getBaseName(fileName); String baseName = FilenameUtils.getBaseName(fileName);

@ -554,14 +554,14 @@ public class ApiController extends BaseController {
// 更换RFID提交记录添加 // 更换RFID提交记录添加
@PostMapping("/changeBasketEpc") @PostMapping("/changeBasketEpc")
public AjaxResult changeBasketEpc(@RequestBody BaseBasketInfo baseBasketInfo) { public AjaxResult changeBasketEpc(@RequestBody BaseBasketInfo baseBasketInfo) {
// int tagCount = baseBasketInfoService.selectCountBasketByEpc(baseBasketInfo.getBasketEpc()); int tagCount = baseBasketInfoService.selectCountBasketByEpc(baseBasketInfo.getBasketEpc());
// if (tagCount > 0) { if (tagCount > 0) {
// return AjaxResult.error("RFID标签1已绑定"); return AjaxResult.error("RFID标签1已绑定");
// } }
// tagCount = baseBasketInfoService.selectCountBasketByEpc(baseBasketInfo.getBasketEpc2()); tagCount = baseBasketInfoService.selectCountBasketByEpc(baseBasketInfo.getBasketEpc2());
// if (tagCount > 0) { if (tagCount > 0) {
// return AjaxResult.error("RFID标签2已绑定"); return AjaxResult.error("RFID标签2已绑定");
// } }
int i = baseBasketInfoService.updateBaseBasketInfo(baseBasketInfo); int i = baseBasketInfoService.updateBaseBasketInfo(baseBasketInfo);

@ -21,6 +21,7 @@ import org.apache.commons.lang3.StringUtils;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Method;
import java.nio.MappedByteBuffer; import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
import java.security.MessageDigest; import java.security.MessageDigest;
@ -43,16 +44,26 @@ public final class Md5Utils {
return ""; return "";
} }
FileInputStream in = null; FileInputStream in = null;
FileChannel channel = null;
try { try {
in = new FileInputStream(file); in = new FileInputStream(file);
FileChannel channel = in.getChannel(); channel = in.getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, file.length()); MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
MessageDigest md = MessageDigest.getInstance("MD5"); MessageDigest md = MessageDigest.getInstance("MD5");
md.update(buffer); md.update(buffer);
// Windows下 MappedByteBuffer 会锁住文件,必须显式释放才能删除
// cleanMappedBuffer(buffer);
return bytes2Hex(md.digest()); return bytes2Hex(md.digest());
} catch (NoSuchAlgorithmException | IOException e) { } catch (NoSuchAlgorithmException | IOException e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
// 先关 channel再关 stream
if (channel != null) {
try {
channel.close();
} catch (IOException ignored) {
}
}
if (in != null) { if (in != null) {
try { try {
in.close(); in.close();
@ -63,6 +74,19 @@ public final class Md5Utils {
return ""; return "";
} }
/** 释放 MappedByteBuffer 持有的文件句柄Windows 必需) */
private static void cleanMappedBuffer(MappedByteBuffer buffer) {
try {
Method cleanerMethod = buffer.getClass().getMethod("cleaner");
cleanerMethod.setAccessible(true);
Object cleaner = cleanerMethod.invoke(buffer);
Method cleanMethod = cleaner.getClass().getMethod("clean");
cleanMethod.setAccessible(true);
cleanMethod.invoke(cleaner);
} catch (Exception ignored) {
}
}
/** /**
* MD5 * MD5
* *

@ -30,11 +30,10 @@
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">位置:</label> <label class="col-sm-3 control-label">位置:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<!-- <input type="hidden" name="downloadUrl">--> <input type="hidden" id="downloadUrl" name="downloadUrl">
<!-- <div class="file-loading">--> <div class="file-loading">
<!-- <input class="form-control file-upload" id="downloadUrl" name="file" type="file">--> <input id="apkFile" name="file" type="file">
<input id="filePath" name="filePath" class="form-control" type="file"> </div>
<!-- </div>-->
</div> </div>
</div> </div>
</form> </form>
@ -49,30 +48,17 @@
}); });
function submitHandler() { function submitHandler() {
// if ($.validate.form()) { if ($("#downloadUrl").val() === '') {
// $.operate.save(prefix + "/add", $('#form-pda_version-add').serialize()); $.modal.alertWarning("请先上传APK文件");
// }
var formData = new FormData();
if ($('#filePath')[0].files[0] == null) {
$.modal.alertWarning("请先选择文件路径");
return false; return false;
} }
formData.append('versionCode', $("input[name='versionCode']").val()); var data = {
formData.append('versionName', $("input[name='versionName']").val()); versionCode: $("input[name='versionCode']").val(),
formData.append('modifyContent', $("input[name='modifyContent']").val()); versionName: $("input[name='versionName']").val(),
formData.append('file', $('#filePath')[0].files[0]); modifyContent: $("input[name='modifyContent']").val(),
$.ajax({ downloadUrl: $("#downloadUrl").val()
url: prefix + "/add", };
type: 'post', $.operate.save(prefix + "/add", data);
cache: false,
data: formData,
processData: false,
contentType: false,
dataType: "json",
success: function(result) {
$.operate.successCallback(result);
}
});
} }
// $(".file-upload").fileinput({ // $(".file-upload").fileinput({
@ -86,6 +72,18 @@
// }) // })
$(function() { $(function() {
// APK文件上传
$("#apkFile").fileinput({
uploadUrl: ctx + 'common/upload',
maxFileCount: 1,
autoReplace: true,
uploadExtraData: { fileType: "apk" }
}).on('fileuploaded', function (event, data) {
// 上传成功,将服务器返回的相对路径写入隐藏字段
$("#downloadUrl").val(data.response.url);
}).on('fileremoved', function () {
$("#downloadUrl").val('');
});
$('.summernote').summernote({ $('.summernote').summernote({
lang: 'zh-CN', lang: 'zh-CN',
dialogsInBody: true, dialogsInBody: true,

Loading…
Cancel
Save