文件传服务器上全是乱码,解决txt文件上传oss服务器乱码的问题

今天上传txt文件下载下来却乱码,搞了一下午,发现还挺复杂。记录一下。

1.首先服务器只接受utf-8格式的文件,所以首先想到的就是转码问题。

79e2e5e627a1ae8c750108f9dd66fddf.png

这是网上很容易就找到的判断文件编码的代码。判断出来之后如果是UTF8格式的文件就正常上传,如果不是就先转成UTF8格式再上传。

我以为问题解决了的时候,发现上传之后还是乱码。然后我就创建两个内容一样但是编码不一样的文件仔细比较,发现我转码之后的byte数组少了正常文件的utf8标识符。

然后byte数组前面就要加上-17  -69 -65的标识符

代码如下

216ec2de88b51ae415f6b12d803684e6.png

就我以为要万事大吉的时候,那边测试告诉我还不行。于是我把他的文件拿过来测试。

发现他的文件是UTF8格式,但是没有标识符!!我的getCode代码判断不出来他是UTF8 当成GBK处理了,自然还是乱码。

于是我百度一番,找到了一个jar包可以帮住我识别他是utf8文件,可是直接上传还不行,因为没有前缀 oss服务器那边也不认。

于是我就要用jar包的方式判断编码来转码,用前缀判断编码的方式来给byte数组增加前缀。

下面是完整的代码和关联的pom文件

com.googlecode.juniversalchardetjuniversalchardet1.0.3

private static InputStream create(MultipartFile file) throwsIOException {if (!file.getOriginalFilename().endsWith("txt")) {returnfile.getInputStream();

}

OutputStream outputStream= newByteArrayOutputStream();

String code=getCode(file.getInputStream());

String code2=getCode2(file.getInputStream());//getFilecharset(file.getInputStream())

if (code.equals("UTF-8")) {returnfile.getInputStream();

}else{

String str=IOUtils.toString(file.getInputStream(), code2);byte[] head = new byte[3];

head[0] = -17;

head[1] = -69;

head[2] = -65;

outputStream.write(head,0, 3);

outputStream.write(str.getBytes(),0, str.getBytes().length);

ByteArrayOutputStream baos=(ByteArrayOutputStream)outputStream;

InputStream inputStream= newByteArrayInputStream(baos.toByteArray());returninputStream;

}

}private static String getCode2(InputStream inputStream) throwsIOException {

UniversalDetector detector= new UniversalDetector(null);byte[] buf = new byte[4096];//(2)

intnread;while ((nread = inputStream.read(buf)) > 0 && !detector.isDone()) {

detector.handleData(buf,0, nread);

}//(3)

detector.dataEnd();//(4)

String encoding =detector.getDetectedCharset();returnencoding;

}private staticString getCode(InputStream inputStream) {

String charsetName= "gbk";byte[] head = new byte[3];try{

inputStream.read(head);

inputStream.close();if (head[0] == -1 && head[1] == -2 ) //0xFFFE

charsetName = "UTF-16";else if (head[0] == -2 && head[1] == -1 ) //0xFEFF

charsetName = "Unicode";//包含两种编码格式:UCS2-Big-Endian和UCS2-Little-Endian

else if(head[0]==-27 && head[1]==-101 && head[2] ==-98)

charsetName= "UTF-8"; //UTF-8(不含BOM)

else if(head[0]==-17 && head[1]==-69 && head[2] ==-65)

charsetName= "UTF-8"; //UTF-8-BOM

} catch(Exception e) {

}returncharsetName;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于JavaWeb应用程序,您可以使用OSS SDK提供的Multipart Upload API来实现文件分片上传OSS文件服务器。下面是一个简单的示例代码,演示如何使用Java SDK实现文件分片上传OSS。 ```java public class OSSFileUploader { // 阿里云OSS的Access Key ID和Access Key Secret private static final String ACCESS_KEY_ID = "<your_access_key_id>"; private static final String ACCESS_KEY_SECRET = "<your_access_key_secret>"; // 阿里云OSS的Endpoint private static final String ENDPOINT = "<your_endpoint>"; // 阿里云OSS的Bucket名称 private static final String BUCKET_NAME = "<your_bucket_name>"; // 阿里云OSS的Object名称(即上传OSS后的文件名) private static final String OBJECT_NAME = "<your_object_name>"; // 每个分片的大小(单位:字节) private static final int PART_SIZE = 1024 * 1024; // 初始化OSSClient对象 private static final OSSClient client = new OSSClient(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET); /** * 将指定文件上传到阿里云OSS * * @param filePath 要上传文件路径 */ public static void upload(String filePath) throws Exception { // 初始化一个MultipartUpload请求 InitiateMultipartUploadResult initResult = client.initiateMultipartUpload(BUCKET_NAME, OBJECT_NAME); // 获取Upload ID,用于后续的分片上传 String uploadId = initResult.getUploadId(); // 计算文件分片数量 File file = new File(filePath); long fileSize = file.length(); int partCount = (int) Math.ceil((double) fileSize / PART_SIZE); // 将文件分成多个分片上传 List<PartETag> partETags = new ArrayList<PartETag>(); for (int i = 0; i < partCount; i++) { // 计算分片的起始位置和长度 long startPos = i * PART_SIZE; long partSize = Math.min(PART_SIZE, fileSize - startPos); // 读取分片数据 RandomAccessFile raf = new RandomAccessFile(file, "r"); raf.seek(startPos); byte[] partData = new byte[(int) partSize]; raf.read(partData); raf.close(); // 上传分片数据 UploadPartRequest uploadRequest = new UploadPartRequest(); uploadRequest.setBucketName(BUCKET_NAME); uploadRequest.setKey(OBJECT_NAME); uploadRequest.setUploadId(uploadId); uploadRequest.setPartNumber(i + 1); uploadRequest.setInputStream(new ByteArrayInputStream(partData)); uploadRequest.setPartSize(partSize); UploadPartResult uploadResult = client.uploadPart(uploadRequest); // 获取分片的ETag,并保存到列表中 partETags.add(uploadResult.getPartETag()); } // 完成上传操作 CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(BUCKET_NAME, OBJECT_NAME, uploadId, partETags); client.completeMultipartUpload(completeRequest); } } ``` 在上述示例代码中,`upload()`方法接受要上传文件路径,并将文件分成多个分片进行上传,最终完成整个上传操作。需要注意的是,每个分片的大小可以根据具体情况进行调整。另外,您需要将代码中的ACCESS_KEY_ID、ACCESS_KEY_SECRET、ENDPOINT、BUCKET_NAME和OBJECT_NAME替换成您自己的阿里云OSS相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值