2015-09-07 14 views
11

Hi gerade lernen, js und reactive-native zu verwenden. Ich kann FormData nicht verwenden, es zeigt immer nicht unterstützten bodyninit Typ. Ich möchte lieber Text als json.stringfy senden. Kann mir jemand helfen? Vielen Dank!Wie verwendet man FormData in reaktionsnativen?

var data = new FormData() 
data.append('haha', 'input') 

fetch('http://www.mywebsite.com/search.php', { 
    method: 'post', 
    body: data 
}) 
.then((response) => response.json()) 
.then((responseData) => { 
    console.log('Fetch Success=================='); 
    console.log(responseData); 

    var tempMarker = []; 
    for (var p in responseData) { 
    tempMarker.push({ 
    latitude: responseData[p]['lat'], 
    longitude: responseData[p]['lng'] 
    }) 
    } 

    this.setState({ 
    marker: tempMarker 
    }); 

}) 
.catch((error) => { 
    console.warn(error); 
}) 
.done(); 
+0

Was ist die eigentliche Fehlermeldung? – jevakallio

+0

"nicht unterstützte bodinit typ" – phongyewtong

Antwort

9

Dieser arbeitete für mich

var serializeJSON = function(data) { 
    return Object.keys(data).map(function (keyName) { 
    return encodeURIComponent(keyName) + '=' + encodeURIComponent(data[keyName]) 
    }).join('&'); 
} 

var response = fetch(url, { 
    method: 'POST', 
    body: serializeJSON({ 
    haha: 'input' 
    }) 
}); 
+2

wie kann ich nur text verwenden? nicht json – phongyewtong

+1

var response = fetch (url, { methode: 'POST', body: encodeURIComponent ("haha") + '=' + encodeURIComponent ("input") }); –

22

Hier ist meine einfache Code-Formdata mit reagieren-native Anfrage mit String und Bild zu posten.

Ich habe verwendet reagieren-native-Bild-Picker wählen/Foto aufzunehmen react-native-image-picker

let photo = { uri: source.uri} 
let formdata = new FormData(); 

formdata.append("product[name]", 'test') 
formdata.append("product[price]", 10) 
formdata.append("product[category_ids][]", 2) 
formdata.append("product[description]", '12dsadadsa') 
formdata.append("product[images_attributes[0][file]]", {uri: photo.uri, name: 'image.jpg', type: 'multipart/form-data'}) 


fetch('http://192.168.1.101:3000/products',{ 
    method: 'post', 
    headers: { 
    'Content-Type': 'multipart/form-data', 
    }, 
    body: formdata 
    }).then(response => { 
    console.log("image uploaded") 
    }).catch(err => { 
    console.log(err) 
    }) 
}); 
+1

Darf ich wissen, woher kommt die Klasse FormData? Ich habe react-native-image-picker überprüft, es ist nicht innerhalb –

+0

FormData kommt mit react-native. https://github.com/facebook/react-native/blob/master/Libraries/Network/FormData.js –

+1

Laut dem MSDN-Dokument sollte 'FormData' eine' set() 'Methode haben (in Chrome für Instanz), aber offensichtlich ist dies nicht in React Native verfügbar, so ist die Lösung in der Tat zu verwenden 'append()' –

0

Ich habe Daten verwendete Form mit ImagePicker Plugin. und ich arbeiten sie bitte

ImagePicker.showImagePicker(options, (response) => { 
    console.log('Response = ', response); 
    if (response.didCancel) { 
    console.log('User cancelled photo picker'); 
    } 
    else if (response.error) { 
    console.log('ImagePicker Error: ', response.error); 
    } 
    else if (response.customButton) { 
    console.log('User tapped custom button: ', response.customButton); 
    } 
    else { 
    fetch(globalConfigs.api_url+"/gallery_upload_mobile",{ 
     method: 'post', 
     headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json' 
    }, 
     , 
    body: JSON.stringify({ 
     data: response.data.toString(), 
     fileName: response.fileName 
    }) 
     }).then(response => { 
     console.log("image uploaded") 
     }).catch(err => { 
     console.log(err) 
     }) 
    } 
}); 
+1

Wie können Sie mehrteiligen Inhalt über JSON senden (überprüfen Sie Ihre Content-Type-Header) –

+0

@AzeemHassni Update meine Antwort gemäß Ihrer Überprüfung als ich Bilder in Base64-String bekam, warum JSON verwendet wurde – akshay

0

Bereitstellung eine andere Lösung unter Code überprüfen; Wir verwenden auch react-native-image-picker; und die Serverseite verwendet koa-multer; dieses Set-up funktioniert gut:

ui

ImagePicker.showImagePicker(options, (response) => { 
     if (response.didCancel) {} 
     else if (response.error) {} 
     else if (response.customButton) {} 
     else { 
     this.props.addPhoto({ // leads to handleAddPhoto() 
      fileName: response.fileName, 
      path: response.path, 
      type: response.type, 
      uri: response.uri, 
      width: response.width, 
      height: response.height, 
     }); 
     } 
    }); 

handleAddPhoto = (photo) => { // photo is the above object 
    uploadImage({ // these 3 properties are required 
     uri: photo.uri, 
     type: photo.type, 
     name: photo.fileName, 
    }).then((data) => { 
     // ... 
    }); 
    } 

Client

export function uploadImage(file) { // so uri, type, name are required properties 
    const formData = new FormData(); 
    formData.append('image', file); 

    return fetch(`${imagePathPrefix}/upload`, { // give something like https://xx.yy.zz/upload/whatever 
    method: 'POST', 
    body: formData, 
    } 
).then(
    response => response.json() 
).then(data => ({ 
    uri: data.uri, 
    filename: data.filename, 
    }) 
).catch(
    error => console.log('uploadImage error:', error) 
); 
} 

Server

import multer from 'koa-multer'; 
import RouterBase from '../core/router-base'; 

const upload = multer({ dest: 'runtime/upload/' }); 

export default class FileUploadRouter extends RouterBase { 
    setupRoutes({ router }) { 
    router.post('/upload', upload.single('image'), async (ctx, next) => { 
     const file = ctx.req.file; 
     if (file != null) { 
     ctx.body = { 
      uri: file.filename, 
      filename: file.originalname, 
     }; 
     } else { 
     ctx.body = { 
      uri: '', 
      filename: '', 
     }; 
     } 
    }); 
    } 
}