主要思路就是获取链接资源,获得输入流然后转字节,字节再转MultipartFile对象, 看到最后步骤的MultipartFile对象是不是就很熟悉了呢?
:适用spring框架,因为使用MultipartFile的前提是使用了sprin框架注意
private MultipartFile getFile(String pdfUrl, String fileName) throws IOException {
URL url = new URL(pdfUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置超时间为3秒
conn.setConnectTimeout(3 * 1000);
//防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//得到输入流
InputStream inputStream = conn.getInputStream();
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while ((rc = inputStream.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
byte[] in2b = swapStream.toByteArray();
return new BytesToMultipartFile(in2b, "file", fileName, MediaType.MULTIPART_FORM_DATA);
}
字节转MultipartFile核心代码
package com.dindo.invoice.util;
import com.dindo.core.tool.utils.Func;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 字节转MultipartFile
* @author Fan HaoJie
*/
@Slf4j
public class BytesToMultipartFile implements MultipartFile {
private final byte[] bytes;
private final String name;
private final String originalFilename;
private final String contentType;
public BytesToMultipartFile(byte[] bytes, String name, String originalFilename, MediaType contentType) {
this.bytes = bytes;
this.name = name;
this.originalFilename = originalFilename;
this.contentType = contentType.getType();
}
@Override
public String getName() {
return name;
}
@Override
public String getOriginalFilename() {
return originalFilename;
}
@Override
public String getContentType() {
return contentType;
}
@Override
public boolean isEmpty() {
return bytes == null || bytes.length == 0;
}
@Override
public long getSize() {
return bytes.length;
}
@Override
public byte[] getBytes() throws IOException {
return bytes;
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(bytes);
}
@Override
public void transferTo(File dest) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(dest);
fileOutputStream.write(bytes);
fileOutputStream.flush();
} catch (IOException e) {
log.info(e.getLocalizedMessage(), e);
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
log.info(e.getLocalizedMessage(), e);
}
}
}
}
/**
* byte数组转 MultipartFile
*
* @param bytes byte数组
* @param name 文件名称,也就是文件key
* @param originalFilename 文件原始名称
* @param contentType 文件类型 具体请查此表 https://tool.oschina.net/commons
* @return
*/
public static MultipartFile bytesToMultipartFile(byte[] bytes, String name, String originalFilename, MediaType contentType) {
if (bytes == null || bytes.length == 0 || Func.isAnyBlank(name, originalFilename)) {
return null;
}
return new BytesToMultipartFile(bytes, name, originalFilename, contentType);
}
}