【问题标题】:image bytes upload with request parameter swift 4使用请求参数 swift 4 上传图像字节
【发布时间】:2018-10-01 19:18:38
【问题描述】:

网址 = https://test...com/camimage.aspx

方法类型:发布

请求参数:

  1. 头参数[“UserID”]
  2. 图像字节数

我只获得了带有 url 和多部分表单数据中的 post 请求的上述信息。我尝试了 swift4 multipart 但无法达到预期的结果。

使用代码和日志更新问题

 func UploadRequest()
{
    let url = URL(string: "https://...com/webcam/camimage.aspx")

    let request = NSMutableURLRequest(url: url!)
    request.httpMethod = "POST"


    let boundary = generateBoundaryString()

    request.addValue("UserID", forHTTPHeaderField: "110159")
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    if (imageView.image == nil)
    {
        return
    }

    let image_data = UIImagePNGRepresentation(imageView.image!)

    if(image_data == nil)
    {
        return
    }

    let body = NSMutableData()
    let fname = "test.png"
    let mimetype = "image/png"


    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"uploaded_file\"; filename=\"\(fname)\"\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append(image_data!)
    body.append("\r\n".data(using: String.Encoding.utf8)!)

    body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)

    request.httpBody = body as Data

    let session = URLSession.shared

    let task = session.dataTask(with: request as URLRequest, completionHandler: {
        (
        data, response, error) in

        guard ((data) != nil), let _:URLResponse = response, error == nil else {
            print("error")
            return
        }

        if let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
        {
            print(dataString)
        }

    })

    task.resume()

}


func generateBoundaryString() -> String
{
    return "*****"
}

我也在放 Android 代码。可能有助于分析

            FileInputStream fileInputStream = new FileInputStream(selectedFile);
            URL url = new URL(SERVER_URL);
            connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);//Allow Inputs
            connection.setDoOutput(true);//Allow Outputs
            connection.setUseCaches(false);//Don't use a cached Copy
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Connection", "Keep-Alive");
            connection.setRequestProperty("ENCTYPE", "multipart/form-data");
            connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
            connection.setRequestProperty("uploaded_file",selectedFilePath);
            connection.setRequestProperty("UserID", "110159");
            //creating new dataoutputstream
            dataOutputStream = new DataOutputStream(connection.getOutputStream());

            //writing bytes to data outputstream
            dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
            dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""
                    + selectedFilePath + "\"" + lineEnd);

            dataOutputStream.writeBytes(lineEnd);

            //returns no. of bytes present in fileInputStream
            bytesAvailable = fileInputStream.available();
            //selecting the buffer size as minimum of available bytes or 1 MB
            bufferSize = Math.min(bytesAvailable,maxBufferSize);
            //setting the buffer as byte array of size of bufferSize
            buffer = new byte[bufferSize];

            //reads bytes from FileInputStream(from 0th index of buffer to buffersize)
            bytesRead = fileInputStream.read(buffer,0,bufferSize);

            //loop repeats till bytesRead = -1, i.e., no bytes are left to read
            while (bytesRead > 0){
                //write the bytes read from inputstream
                dataOutputStream.write(buffer,0,bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable,maxBufferSize);
                bytesRead = fileInputStream.read(buffer,0,bufferSize);
            }

            dataOutputStream.writeBytes(lineEnd);
            dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

            serverResponseCode = connection.getResponseCode();
            String serverResponseMessage = connection.getResponseMessage();

            Log.i(TAG, "Server Response is: " + serverResponseMessage + ": " + serverResponseCode);

            //response code of 200 indicates the server status OK
            if(serverResponseCode == 200){
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tvFileName.setText("File Upload completed.\n\n You can see the uploaded file here: \n\n" + "http://coderefer.com/extras/uploads/"+ fileName);
                    }
                });
            }

            //closing the input and output streams
            fileInputStream.close();
            dataOutputStream.flush();
            dataOutputStream.close();

我可以通过邮递员上传图片。仍然无法配置为通过快速代码上传。

请查看附件中的两个 postman webapi chrome 工具截图。希望高手能帮帮我..

第一

第二

提前致谢。

【问题讨论】:

  • 询问您的服务器端工程师什么是正确的格式。图像可以以各种方式上传。使用二进制、base64 或十六进制的整个 HTTP 正文。可能是带有某种编码的编码字节的 JSON。可以是multipart/form-data,也可以使用application/x-www-form-urlencoded。您的服务器使用什么格式?
  • 是的,它是一个多部分/表单数据。收到内部服务器错误 500。
  • 请显示您用于发送multipart/form-data 请求并收到服务器错误500 的代码。当您收到该错误时,请尝试获取服务器日志。
  • @OOPer 我已经用代码和 Xcode 日志更新了问题。需要知道编码中缺少的元素。谢谢。
  • 我认为您在代码name=\"file\" 中为图像传递了错误的参数。和邮递员uploaded_file。所以把name=\"file\"改成name=\"uploaded_file\"

标签: swift4 ios11


【解决方案1】:

使用这个吊舱:https://github.com/Alamofire/Alamofire
参考:https://gist.github.com/DejanEnspyra/5bae2a301b2b2bb5de3109344345617f

func requestWith(endUrl: String, imageData: Data?, parameters: [String : Any], onCompletion: ((JSON?) -> Void)? = nil, onError: ((Error?) -> Void)? = nil){

let url = "http://google.com" /* your API url */

let headers: HTTPHeaders = [
    /* "Authorization": "your_access_token",  in case you need authorization header */
    "Content-type": "multipart/form-data"
]

Alamofire.upload(multipartFormData: { (multipartFormData) in
    for (key, value) in parameters {
        multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
    }

    if let data = imageData{
        multipartFormData.append(data, withName: "image", fileName: "image.png", mimeType: "image/png")
    }

}, usingThreshold: UInt64.init(), to: url, method: .post, headers: headers) { (result) in
    switch result{
    case .success(let upload, _, _):
        upload.responseJSON { response in
            print("Succesfully uploaded")
            if let err = response.error{
                onError?(err)
                return
            }
            onCompletion?(nil)
        }
    case .failure(let error):
        print("Error in upload: \(error.localizedDescription)")
        onError?(error)
    }
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2018-10-25
    • 2017-07-14
    • 2019-03-16
    • 2017-04-22
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多