複数の画像のアップロードを実現し、formData は動的な画像を運び、画像を順番に並べ替え、シリアル番号に従って画像を置き換え、画像ファイルにロゴを添付します
必要
- パラメータ リクエスト インターフェイスを運ぶときの formData は、JSON 構造に変換する必要があります。
- 順番に表示された写真のリストは、order でマークする必要があります
- 単一の画像をアップロードすると、単一の画像に識別パラメータが含まれます (追加、編集)
- 複数の写真をアップロードし、複数の写真が注文パラメータを運ぶ (新規、編集)
- 編集後の複数の写真の位置関係と、バックエンドが受け取る必要のある識別情報
一連の考え
- formData 形式は、(動的) 配列の形式でパラメーターを渡すことをサポートしていますが、オブジェクトを配列に追加するときにオブジェクトを変換 ( JSON.stringify ) する必要があり、ファイルを固定パラメーターで運ぶ必要があります。
- 画像を順番にアップロードする場合, 画像を運ぶ際にシーケンス識別子 (要素 ui アップロード アップロード コンポーネント) を追加する必要があります. 画像アップロード コールバック メソッドでは, ファイル リストをトラバースします. トラバーサルでは, 内のパラメータに順番にパラメータを追加します.ファイルであり、値は注文番号です。
- 単一画像のアップロード
3.1 単一画像の追加: ファイルのアップロード時にコールバック メソッドにロゴを追加するだけで済みます。インターフェイスを要求する前に、さまざまなロゴに応じてさまざまなパラメーターを追加します。3.2 単一画像の編集: に従って元の画像を置き換えます
。 file id および id を新しい画像ファイルに割り当て、処理のためにバックエンドに運びます
- 複数の写真をアップロードする(順序要件)
4.1 複数の写真をアップロードする場合は、それぞれに固定の順序を付ける必要があります(順序はアップロードの最初から固定されており、その後の変更もこの順序に対応しています) 4.2 最初の固定位置の後
、ファイルを削除した後、ファイルをアップロードします。このとき、アップロードされたファイルは、削除されたファイルの順序で徐々に割り当てられます (たとえば、位置 1 が削除された場合、アップロード時に位置 1 の順序が割り当てられます。位置 1 と 2 が削除された場合、アップロード時に最初に位置 1 の順序が割り当てられます.1 位置の順序が割り当てられ、次に 2 位置の順序が割り当てられます...削除の順序で徐々に
) parameters:
4.3.1 新旧のファイルを判断する必要がある
4.3.2 新しいファイルを追加するだけ
4.3.3 新しいファイルのリストをチェックする必要がある sort (通常のリスト順序構造[0],[1]...)
編集後の複数の写真の位置関係と、バックエンドが
受け取る必要がある識別情報
formData を JSON 構造コードに変換
let formData = new FormData();
for(var i = 0;i<3;i++){
formData.append(`fileData[${
i}].name`,'测试');
formData.append(`fileData[${
i}].num`,i);
}
fileData:[
{
name:'测试',
num:0
},
{
name:'测试',
num:1
},
{
name:'测试',
num:2
}
]
let formData = new FormData();
for(var i = 0;i<3;i++){
var obj = {
};
obj.name = '测试';
obj.age = 18;
formData.append(`fileObj[${
i}].obj`,obj);
formData.append(`fileObj[${
i}].num`,i);
}
fileObj:[
{
obj:{
name:'测试',
age:18
},
num:0
},
{
obj:{
name:'测试',
age:18
},
num:1
},
{
obj:{
name:'测试',
age:18
},
num:2
}
]
単一の画像のアップロード (追加、編集) ロジック
<el-upload
action=""
:on-change="handleAppTitleChange"
:auto-upload="false"
:show-file-list="false"
class="uploadImage"
ref="uploadImage">
<img v-if="appTitleUrl.url" :src="appTitleUrl.url" class="uploadImage-avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
handleAppTitleChange(file){
file['label']= 'appTitle';
this.appTitleUrl.url = URL.createObjectURL(file.raw);
this.handleImageChange(file,file.label);
},
handleImageChange(file, label){
if(this.editMethodUser == 1){
var fileTypeId = _.filter(this.changeFileList,['label',label])[0].fileId;
file['fileId'] = fileTypeId;
this.removeOldImageList.push(fileTypeId);
if(_.filter(this.paramsData.files,['fileId',fileTypeId]).length > 0){
this.paramsData.files.filter((v,index)=>{
if(v.fileId == fileTypeId){
this.$set(this.paramsData.files,index,file);
}
})
}else {
this.paramsData.files.push(file);
}
}else {
if(_.filter(this.paramsData.files,['label',label]).length > 0){
this.paramsData.files.filter((v,index)=>{
if(v.label == label){
this.$set(this.paramsData.files,index,file);
}
})
}else {
this.paramsData.files.push(file);
}
}
this.removeOldImageList = [... new Set(this.removeOldImageList)];
},
let formData = new FormData();
Object.entries(this.paramsData.files).forEach((file,i) => {
if(file[1].raw){
if(file[1].label == 'appLogo'){
file[1].fileDesc = new Object();
file[1].fileDesc['title'] = this.paramsData.platform;
file[1].fileDesc['label'] = file[1].label;
formData.append(`fileData[${
i}].fileDesc`,JSON.stringify(file[1].fileDesc));
}else if(file[1].label == 'appImage'){
file[1].fileDesc = new Object();
file[1].fileDesc['label'] = file[1].label;
formData.append(`fileData[${
i}].fileDesc`,JSON.stringify(file[1].fileDesc));
}else if(file[1].label == 'appTitle'){
file[1].fileDesc = new Object();
file[1].fileDesc['title'] = this.paramsData.title;
file[1].fileDesc['label'] = file[1].label;
formData.append(`fileData[${
i}].fileDesc`,JSON.stringify(file[1].fileDesc));
}
formData.append(`fileData[${
i}].file`,file[1].raw);
}
});
複数の画像をアップロードするためのコード (注文要件あり) (使用される '_' は lodash への参照であり、主にデータの処理に使用されます)
<el-form-item prop="imageList">
<el-upload
action=""
:multiple="true"
list-type="picture-card"
:on-change="handleImageChange"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:auto-upload="false"
:file-list="paramsData.files"
class="uploadImage"
ref="uploadImage">
<div class="uploadIcon">
<i class="el-icon-plus"></i>
<span>上传</span>
</div>
</el-upload>
<el-dialog :visible.sync="dialogVisible" :modal-append-to-body="false">
<img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>
</el-form-item>
handleRemove(file, fileList) {
this.removeOldImageList.push(file.fileId);
this.deleteFileInfo.fileIdList.push(file.fileId);
this.deleteFileInfo.orderNumList.push(file.orderNum);
this.paramsData.files = fileList;
},
handleImageChange(file, fileList){
fileList.filter((v,index)=>{
if(v.raw && !v.orderNum){
if(this.deleteFileInfo.orderNumList.length > 0){
v['orderNum'] = (this.deleteFileInfo.orderNumList[0] + 1);
v['fileId'] = this.deleteFileInfo.fileIdList[0];
this.deleteFileInfo.orderNumList.splice(0,1);
this.deleteFileInfo.fileIdList.splice(0,1);
}else {
v['orderNum'] = (index + 1);
this.deleteFileInfo.orderNumList = [];
this.deleteFileInfo.fileIdList = [];
}
}
})
this.paramsData.files = fileList;
},
let formDatas = new FormData();
var newFileList = _.sortBy(_.filter(this.paramsData.files,'raw'), function(o) {
return o.orderNum; });
if(this.editMethodUser == 1){
Object.entries(newFileList).forEach((file,i) => {
formDatas.append(`fileData[${
i}].file`,file[1].raw);
formDatas.append(`fileData[${
i}].orderNum`,(file[1].orderNum - 1));
});
}else {
Object.entries(this.paramsData.files).forEach((file,i) => {
if(file[1].raw){
formDatas.append(`fileData[${
i}].file`,file[1].raw);
}
});
}