Python http同时上传多个文件
最近遇到一个需求,树莓派要通过网络上传图片到服务器,每次上传6张图片,如果要一张一张上传太慢,想一次上传。所以在网上搜了一下python的多附件上传,但是没有找到直接能用的代码,最后把网上的代码拿来,调试通过,记录一下。
1、python 上传代码
def uploadImgs(webConf, imgFilePaths, log):
url = f"http://{webConf['host']}:{webConf['port']}{webConf['upload_img_path']}"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0',
'Referer': url
}
data = [("realName", None), ("typeNum", '0'), ("orderNum", '-1'), ("remark", "")]
files = []
try :
for i in range(0, len(imgFilePaths)):
file = open(imgFilePaths[i], 'rb')
files.append(file)
fileName = os.path.basename(file.name)
filePart = ('files', (fileName, file, 'image/jpeg'))
data.append(filePart)
multipart_encoder = MultipartEncoder(data)
headers['Content-Type'] = multipart_encoder.content_type
response = requests.post(url, data=multipart_encoder, headers=headers)
return response.json()
except Exception as ex:
log.exception("上传文件失败")
for file in files:
file.close()
return json.loads('{"code": -1}')
realName 并没有什么用,实际文件名从filePart中取。
2、springboot 接口
/**
* 上传附件
* @param uploadForm
* @return
*/
@PostMapping("/uploadImg")
@ApiOperation(value = "上传图片",notes = "上传图片")
public AjaxResult uploadImg(@ModelAttribute UploadImgDto uploadForm) throws IOException {
MultipartFile[] files = uploadForm.getFiles();
String filePath = RuoYiConfig.getUploadPath();
MultipartFile file = null;
String fileName = null;
byte[] bytes = null;
String extensionName = null;
String saveName = null;
Path path = null;
List<Attach> attachs = Lists.newArrayList();
List<String> saveNames = Lists.newArrayList();
for(int i=0; i<files.length; i++){
file = files[i];
if (file.isEmpty()) {
continue;
}
// 获取文件名
fileName = file.getOriginalFilename();
// 获取文件的字节
bytes = file.getBytes();
extensionName = fileName.split("\\.")[1];
saveName = UUID.randomUUID() + "." + extensionName;
path = Paths.get(filePath, saveName);
ImgUtil.saveImg(path, bytes);
saveNames.add(saveName);
}
return success(saveNames);
}
/**
* 上传附件
*
* @author xxxx
* @date xxxx-xx-xx
*/
@Data
@ApiModel(value = "上传附件参数")
public class UploadImgDto
{
@ApiModelProperty(value = "文件类型")
private Long typeNum = 0L;
private String remark;
@ApiModelProperty(value = "图片文件")
@Transient
private MultipartFile[] files;
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("typeNum", getTypeNum())
.append("remark", getRemark())
.toString();
}